仅为特定帖子类型设置META_QUERY

时间:2018-07-05 作者:janlindso

我试图在搜索中隐藏我的Woocommerce产品中的缺货,同时在结果中显示其他帖子类型。这个post type 因为产品是product.

add_action( \'pre_get_posts\', \'hide_out_of_stock_from_search\' );

function hide_out_of_stock_from_search( $q ) {

    if ( ! $q->is_search() ) return;
    if ( is_post_type_archive( \'product\' ) ) {

        $q->set( \'meta_query\', array(array(
            \'key\'       => \'_stock_status\',
            \'value\'     => \'outofstock\',
            \'compare\'   => \'NOT IN\'
        )));

    }

    remove_action( \'pre_get_posts\', \'hide_out_of_stock_from_search\' );
}
除了is_post_type_archive( \'product\' ), 这不会返回true。如果我将其替换为true,它将隐藏搜索查询中的所有内容(甚至帖子和页面),但库存产品除外。

如何仅为特定帖子类型设置meta\\u查询,而不影响搜索查询中的其他帖子类型?

1 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

快速解释搜索是搜索,而不是存档。

如果你看看is_post_type_archive docs,您将看到:

检查查询是否针对给定帖子类型的存档页。

所以如果你在你的pre_get_posts, 这样就不会影响搜索结果。

另一方面,此meta\\u查询:

$q->set( \'meta_query\', array(array(
    \'key\'       => \'_stock_status\',
    \'value\'     => \'outofstock\',
    \'compare\'   => \'NOT IN\'
)));
表明您只想获取具有此元值集且不同于outoofstock, 因此,它将排除所有帖子和页面(因为它们根本没有这样的元数据)。

解决方案

add_action( \'pre_get_posts\', \'hide_out_of_stock_from_search\' );

function hide_out_of_stock_from_search( $q ) {

    if ( ! is_admin() && $q->is_main_query() && $q->is_search() ) {

        $q->set( \'meta_query\', array(
            \'relation\' => \'OR\',
            array(
                \'key\'       => \'_stock_status\',
                \'value\'     => \'outofstock\',
                \'compare\'   => \'NOT IN\'
            ),
            array(
                \'key\'       => \'_stock_status\',
                \'compare\'   => \'NOT EXISTS\'
            )
        ));

    }
}

结束

相关推荐

Twenty Seventeen search error

每当我在wordpress网站上搜索某个内容时,我都会得到以下错误:Fatal error: Uncaught Error: Call to undefined function get_exID() in /var/www/html/wp-content/themes/twentyseventeen/functions.php:360 Stack trace: #0 /var/www/html/wp-includes/class-wp-hook.php(298): twen