web-dev-qa-db-fra.com

La recherche dans différentes catégories sur différentes pages de code ne fonctionne pas

J'ajoute un widget de recherche WordPress par défaut via Elementor sur deux de mes pages, la page X et la page Y. ID de page X = 100, ID de page Y = 200. Je souhaite que l'utilisateur puisse effectuer une recherche dans la catégorie 37 lorsqu'il est activé. la page X, et être capable de chercher dans la catégorie 24 quand il est sur la page Y. J’ai écrit ce 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');

Cependant, cela ne fonctionne pas correctement. Il renvoie les pages qui ont des catégories et des identifiants différents, etc. De plus, les résultats sont identiques à la page X et à la page Y. Quelqu'un peut-il aider à modifier le code?

Remarque: le code ci-dessous fonctionne bien cependant:

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

La réponse avant la mienne vous montre le problème de is_search() dans votre code.

Pour résoudre votre problème, vous pouvez essayer d’ajouter des données à partir de votre formulaire de recherche. Dans votre WordPress, vous avez un searchform.php, vous pouvez éditer ce fichier pour ajouter un nouveau champ caché ou utiliser une fonction de filtre laide comme je le fais ici:

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

Je n'ai pas testé le code, mais c'est un bon moyen de jouer avec ce que vous voulez réaliser.

1
Elex

Eh bien, essayons de comprendre ce que fait votre code ...

Dans cette ligne:

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

vous vérifiez si vous ne vous trouvez pas dans la zone d'administration, si la requête est la requête principale de la page en cours et si la page en cours est une page de recherche.

Et ici:

if ( is_page(100) ) {

vous vérifiez si la page en cours est la page avec l'ID 100.

Donc quel est le problème? Ces conditions ne seront pas satisfaites à la fois ... C'est une page ou une page de résultats de recherche ...

0
Krzysiek Dróżdż