web-dev-qa-db-ja.com

異なるページのコードで異なるカテゴリを検索しても機能しない

私は私のページ、ページXとページYの2つにElementorを通してデフォルトのWordPress検索ウィジェットを追加しています。私はこのコードを書いた:私はこのページを書いた。

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
tera_789

私の前の答えはあなたのコードのis_search()に関する問題を示しています。

あなたの問題を解決するために、あなたはあなたの検索フォームからいくつかのデータを追加しようとすることができます。あなたのWordPressにはsearchform.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']));
    }
}

私はコードをテストしていませんが、達成したいもので遊ぶための良い方法です。

1
Elex

さて、あなたのコードが何をしているのか理解しよう。

この行で:

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

現在のページのメインのクエリであるか、現在のページが検索ページであるかを確認します。

そしてここ:

if ( is_page(100) ) {

現在のページがID 100のページかどうかを確認します。

だから問題は何ですか?これらの条件は両方とも満たされないでしょう...それはページか検索結果ページのどちらかです...

0