WordPress自定义查询以获取多个meta键和meta值

时间:2019-02-18 12:09:43

标签: php mysql wordpress select meta-query

我有多个选择的Dropdown。还使用AJAX通过WP_Query获取数据。

过程:如果我首先选择页面中的“ DropDown”或“ DropDown”,则它将返回结果。然后选择第二个DropDown,然后将其设置为“ AND”关系以获取结果,这意味着应该返回通用结果。

我在设置不同选择之间的关系时遇到了问题。

请帮助我!

这是代码:Filter.js

    var test1 = [];
    var test2 = [];
    var test3 = [];

var ajaxurl = ajaxfilter.ajax_url;
jQuery(document).ready(function() {

    jQuery('#domaine').on('change', function() {
        test1 = jQuery(this).val();

        if (test1 !== null) {
            var data = {
                action: 'get_fill_portfolio',
                opt_domaine: test1,
                opt_status: test2,
                opt_fond: test3
            }
            jQuery.post(ajaxurl, data, function(response) {
                jQuery('.load-state').html(response);
            });
        }

    });

    jQuery('#status').on('change', function() {
        test2 = jQuery(this).val();


        if (test2 !== null) {
            var data = {
                action: 'get_fill_portfolio',
                opt_domaine: test1,
                opt_status: test2,
                opt_fond: test3

            }
            jQuery.post(ajaxurl, data, function(response) {
                jQuery('.load-state').html(response);
            });
        }

    });

    jQuery('#fond').on('change', function() {

        test3 = jQuery(this).val();


        if (test3 !== null) {
            var data = {
                action: 'get_fill_portfolio',
                opt_domaine: test1,
                opt_status: test2,
                opt_fond: test3

            }
            jQuery.post(ajaxurl, data, function(response) {
                jQuery('.load-state').html(response);

            });
        }

    });

Functions.php

add_action('wp_ajax_get_fill_portfolio', 'get_fill_portfolio');
add_action('wp_ajax_nopriv_get_fill_portfolio', 'get_fill_portfolio');
// Select Dropdown List
function get_fill_portfolio() 
{   

   /* check_ajax_referer( 'load_states', 'security' );

    $return = array();
    echo $return;
    wp_die(); // You missed this too*/

    $all_portfolio = [];
    global $post;

    $opt_domaine = $_POST['opt_domaine'];
    $opt_status = $_POST['opt_status'];
    $opt_fond = $_POST['opt_fond'];


    $string = rtrim(implode(',', $opt_domaine), ',');
    $string1 = rtrim(implode(',', $opt_status), ',');
    $string2 = rtrim(implode(',', $opt_fond), ',');


    $args = array(
        'post_type' => 'stm_portfolio',
        'post_status'    => 'publish',
        'orderby'        => 'menu_order',
        'order'          => 'ASC',
        'posts_per_page' => -1,
        'meta_query' => array(
            'relation' => 'OR',

           array(
              'relation' => 'AND',
              'mnf_domaine' =>  array(
                'key' => 'mnf_domaine',
                'value' => $string,
                'compare' => 'IN'
                ),
            ),

            array(
                'relation' => 'AND',
            'mnf_status' => array(
                'key' => 'mnf_status',
                'value' => $string1,
                'compare' => 'IN'
                ),
            ),  

          array(
                'relation' => 'AND',
                'mnf_fond' => array(
                'key' => 'mnf_fond',
                'value' => $string2,
                'compare' => 'IN'
                )
             )
            )
    );

$query_s = new WP_Query( $args );

    if ( $query_s->have_posts() ) { 

        while ( $query_s->have_posts() ) : $query_s->the_post();
            $all_portfolio[] = [
                'name' => get_the_title( $post->ID),
                'mnf_site_web'  => get_field('mnf_site_web', $post->ID),
                'link'   => get_permalink($post->ID),
                'mnf_domaine'  => get_field('mnf_domaine', $post->ID),
                'mnf_status'  => get_field('mnf_status', $post->ID),
                'mnf_fond'  => get_field('mnf_fond', $post->ID),
                'img_url'  => get_the_post_thumbnail_url( $post->ID, 'full' )
            ];
        endwhile;

        if ( $all_portfolio ) : 
            $domaine = get_field_object('mnf_domaine'); 
            $status = get_field_object('mnf_status'); 
            $fond = get_field_object('mnf_fond'); 

        endif;  

?>

 <div class="logo-filter">
        <div class="row">
            <?php foreach ( $all_portfolio as $portfolio ) : ?>
                    <div class="col-md-3 col-sm-4 col-xs-6">
                    <a href="<?=$portfolio['link']?>" target="" class="logo-link">
                        <img alt="<?=$portfolio['name']?>" src="<?=$portfolio['img_url']?>">
                    </a>    
                    </div>
            <?php endforeach; ?>
        </div>
    </div>
<?php
        wp_reset_query();   
        }
    }

?>

当我从具有多个选择的任何下拉列表中进行搜索时,应该给出结果。

目前,我有3个下拉菜单。所以在这里,我想根据下拉菜单中的多选实现搜索功能。当我使用'relation' => 'AND'时,我必须选择三个下拉菜单,然后返回结果。因此,我尝试使用'relation' => 'OR',因此返回所有结果。

因此,在这里我混淆了使用三个下拉菜单与多选功能之间的关系。

我想将Query设置为

AND ( 
  ( wp_postmeta.meta_key = 'mnf_domaine' AND wp_postmeta.meta_value IN ('media', 'media1') ) 
  AND
  ( mt1.meta_key = 'mnf_status' AND mt1.meta_value IN ('test1', 'test2') ) 
  OR 
  ( mt2.meta_key = 'mnf_fond' AND mt2.meta_value IN ('') )

谢谢!

0 个答案:

没有答案