如何在过滤后使用自定义字段值修改Wordpress WP_Query?

时间:2017-10-19 10:04:04

标签: php wordpress advanced-custom-fields

我有三个选择框,允许过滤自定义帖子列表,可以选择任何或所有选项,然后单击“过滤器”按钮,然后重新加载页面并附加过滤后的变量将URL作为查询字符串。这与我的两个自定义分类法完全吻合:

$categories = array('company-sector', 'company-location');
foreach ($categories as $category) {
    if (isset($_GET[$category]) && !empty($_GET[$category])) {
        $query['tax_query'][] = array(
            'taxonomy'  => $category,
            'field'     => 'slug',
            'terms'     => $_GET[$category]
        );
    }
}

但是,在第三个过滤器(使用ACF创建的自定义字段)上使用相同的逻辑,帖子列表不会更改:

if (isset($_GET['company-status']) && !empty($_GET['company-status'])) {
    $query['meta_query'][] = array(
        'key' => 'company_status',
        'value' => $_GET['company-status'],
    );
}

如果我手动将其添加到初始WP_Query中,则此元查询可以正常工作:

$query = array(
    'post_type' => 'company-post',
    'posts_per_page' => $posts_per_page,
    'orderby' => 'title',
    'order' => 'ASC',
    'meta_query' => array(
        array(
            'key' => 'company_status',
            'value' => 'acquired'
        )
    )
);

但是,在从查询字符串中获取变量后尝试将其添加到初始查询中似乎不起作用,我在这里做错了什么?

//修改

即便如此:

$query = array(
    'post_type' => 'company-post',
    'posts_per_page' => $posts_per_page,
    'orderby' => 'title',
    'order' => 'ASC',
    'meta_query' => array(
        array(
            'key' => 'company_status',
            'value' => $_GET['company-status']
        )
    )
);

所以它必须与我将meta_query附加到初始WP_Query的方式有关...

3 个答案:

答案 0 :(得分:0)

我猜你可以在你的functions.php中使用pre_get_posts

// Load our function when hook is set
add_action( 'pre_get_posts', 'js-modifying-main-query' );

function js-modifying-main-query( $query ) {
    $status = $_GET['company-status'];
    if($status && $status != ""){

        if( !is_admin() && $query->is_main_query() && $query->query_vars['post_type'] == 'company-post' ) {

            $query->set('meta_key', 'company_status');
            $query->set('meta_value', $status);

        }

    }
}

没有测试过 - 只是最初的想法。

// EDIT

要查看查询变量,可以使用:

global $wp_query;
var_dump($wp_query->query_vars);

答案 1 :(得分:0)

我仍然不确定为什么我的初始代码无效,但我已经设法找到了一个似乎可以做我需要的解决方法:

 func ChangeImageColor(){

   let currentFilter = CIFilter(name: "CIPhotoEffectNoir")
        currentFilter!.setValue(CIImage(image: self.backgroundProfileImage.image!), forKey: kCIInputImageKey)
        let output = currentFilter!.outputImage
        let cgimg = context.createCGImage(output!,from: output!.extent)
        let processedImage = UIImage(cgImage: cgimg!)
        self.backgroundProfileImage.image = processedImage
  }

//修改

即便如此:

$status = false;
if (isset($_GET['company-status']) && !empty($_GET['company-status'])) {
    $status = array(
        'key' => 'company_status',
        'value' => $_GET['company-status'],
    );
}

$query = array(
    'post_type' => 'company-post',
    'posts_per_page' => $posts_per_page,
    'orderby' => 'title',
    'order' => 'ASC',
    'meta_query' => array($status)
);

但是一旦我尝试这个,它就会失败:

$status = false;
if (isset($_GET['company-status']) && !empty($_GET['company-status'])) {
    $status[] = array(
        'key' => 'company_status',
        'value' => $_GET['company-status'],
    );
}

$query = array(
    'post_type' => 'company-post',
    'posts_per_page' => $posts_per_page,
    'orderby' => 'title',
    'order' => 'ASC',
    'meta_query' => $status
);

答案 2 :(得分:0)

你为company-status推错了值。

if (isset($_GET['company-status']) && !empty($_GET['company-status'])) {
    $query['meta_query'][] = array(
        array(
            'key' => 'company_status',
            'value' => $_GET['company-status'],
        )
    );
}

......制作本:

Array
(
    [0] => Array
        (
            [key] => company_sector
            [value] => val1
        )

    [1] => Array
        (
            [key] => company_status
            [value] => val2
        )

    [2] => Array
        (
            [0] => Array
                (
                    [key] => company_status
                    [value] => val3
                )

        )

)

你应该以这种方式推送到meta_query数组:

$query['meta_query'][] = array(
    'key' => 'company_status',
    'value' => $_GET['company-status'],
);

此外,如果省略参数relation,查询将检查所有键和值 - 但我猜你知道这一点。