wake-up-neo.com

Das Durchsuchen verschiedener Kategorien auf verschiedenen Seiten funktioniert nicht

Ich füge ein Standard-WordPress-Such-Widget über Elementor auf zwei meiner Seiten, Seite X und Seite Y, hinzu. Seite X-ID = 100, Seite Y-ID = 200. Ich möchte, dass der Benutzer die Kategorie 37 durchsuchen kann, wenn er aktiviert ist Seite X, und in der Lage sein, durch Kategorie 24 zu suchen, wenn er auf Seite Y ist. Ich schrieb diesen Code:

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');

Es funktioniert jedoch nicht richtig. Es werden Seiten mit unterschiedlichen Kategorien und IDs usw. zurückgegeben. Außerdem sind die Ergebnisse auf Seite X und Seite Y gleich. Kann jemand beim Bearbeiten des Codes helfen?

Hinweis: Der folgende Code funktioniert jedoch einwandfrei:

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

Die Antwort vor meiner zeigt Ihnen das Problem mit is_search() in Ihrem Code.

Um Ihr Problem zu lösen, können Sie versuchen, einige Daten aus Ihrem Suchformular hinzuzufügen. In Ihrem WordPress haben Sie eine searchform.php, Sie können diese Datei bearbeiten, um ein neues verstecktes Feld hinzuzufügen, oder eine hässliche Filterfunktion verwenden, wie ich es hier getan habe:

// 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']));
    }
}

Ich habe den Code noch nicht getestet, aber es ist eine gute Möglichkeit, mit dem zu spielen, was Sie erreichen möchten.

1
Elex

Versuchen wir zu verstehen, was Ihr Code tut ...

In dieser Zeile:

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

sie überprüfen, ob Sie sich nicht im Administrationsbereich befinden, ob die Abfrage die Hauptabfrage für die aktuelle Seite ist und ob es sich bei der aktuellen Seite um eine Suchseite handelt.

Und hier:

if ( is_page(100) ) {

sie überprüfen, ob es sich bei der aktuellen Seite um eine Seite mit der ID 100 handelt.

Also, was ist das Problem? Diese Bedingungen werden nicht beide erfüllt ... Es ist entweder eine Seite oder eine Suchergebnisseite ...

0