在不同页面上搜索不同类别的代码不起作用

时间:2018-06-14 作者:tera_789

我正在通过Elementor在我的两个页面上添加一个默认的WordPress搜索小部件,第X页和第Y页。第X页ID=100,第Y页ID=200。我希望用户在第X页时能够搜索类别37,在第Y页时能够搜索类别24。我编写了以下代码:

function searchcategory($query) {
    if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
        if ( is_page(100) ) {
            $query->set(\'cat\',37);
        }
        else if ( is_page(200) ) {
            $query->set(\'cat\',24);
        }
    }
}

add_filter(\'pre_get_posts\',\'searchcategory\');
但是,它不能正常工作。它返回具有不同类别和ID等的页面。此外,在第X页和第Y页上的结果都是相同的。有人可以帮助编辑代码吗?

注意:以下代码工作正常:

function searchtest($query) {
    if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
        $query->set( \'cat\', 39 );
    }
}
add_action( \'pre_get_posts\', \'searchtest\' );

2 个回复
SO网友:Elex

我前面的答案告诉你is_search() 在代码中。

为了解决您的问题,您可以尝试从搜索表单中添加一些数据。在WordPress中,您有一个搜索表单。php,您可以编辑此文件以添加新的隐藏字段,或使用丑陋的筛选函数,就像我在这里所做的那样:

// Gives you the category where you want to search with from page ID
add_filter(\'wpse_306057_search_category_id\', \'wpse_306057_search_category_id\', 10, 1);
function wpse_306057_search_category_id($id = false) {
    switch($id)
    {
        case 100:
        $cat_id = 37;
        break;

        case 200:
        $cat_id = 24;
        break;


        case 201:
        case 202:
        case 203:
        $cat_id = array(57,99); // You may use multiple cats
        break;


        default:
        $cat_id = false;
        break;
    }
    return $cat_id;
}

// Add input hidden with "from page" for your search form
add_filter(\'get_search_form\', \'wpse_306057_search_category_input\', 10, 1);
function wpse_306057_search_category_input($form) {
    return str_replace(\'</form>\', \'<input type="hidden" name="search_from_page" value="\'.get_queried_object_id().\'" /></form>\', $form);
}

// Add cat to your query
add_filter(\'pre_get_posts\', \'wpse_306057_search_category\', 10, 1);
function wpse_306057_search_category($query) {
    if(!is_admin()
    && $query->is_main_query()
    && $query->is_search()
    && !empty(@$_GET[\'search_from_page\'])
    && apply_filters(\'wpse_306057_search_category_id\', $_GET[\'search_from_page\']))
    {
        $query->set(\'cat\', apply_filters(\'wpse_306057_search_category_id\', $_GET[\'search_from_page\']));
    }
}
我还没有测试代码,但这是一种很好的方式来实现您想要实现的目标。

SO网友:Krzysiek Dróżdż

好吧,让我们试着理解你的代码在做什么。。。

在此行中:

if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) { 
检查您是否不在管理区域,查询是否是当前页面的主查询,以及当前页面是否是搜索页面。

这里:

if ( is_page(100) ) {
检查当前页面是否为ID为100的页面。

那么问题出在哪里?这些条件不能同时满足。。。它要么是一个页面,要么是一个搜索结果页面。。。

结束