web-dev-qa-db-fra.com

Wordpress déclenche 404 à la page 2 pour une requête de recherche personnalisée

J'ai modifié mon index.php pour vérifier si la requête de recherche est un auteur et si oui, afficher les articles de cet auteur. Cela fonctionne bien, mais dès que vous accédez à la page 2 des résultats, wordpress déclenche une erreur 404. Donc, je suppose que Wordpress n’appelle pas index.php sur http://www.test.com/page/2/?s=my+search+query et j’ai également besoin de mettre le code que j’ai obtenu dans mon index.php ailleurs, mais où?

Edit: Mon code pour la requête personnalisée

$author_res = $wpdb->query("SELECT ID FROM $wpdb->users WHERE display_name LIKE '%".get_search_query()."%' LIMIT 1");
    if($author_res > 0) {
        $author_info = $wpdb->get_row("SELECT * FROM $wpdb->users WHERE display_name LIKE '%".get_search_query()."%' LIMIT 1");
        $article_query = new WP_Query('posts_per_page=7&paged=' . $paged.'&author='.$author_info->ID.'&offset='. $offset);
        if($article_query->have_posts()){
...

$ paginé et $ compensé sont calculés à l'échelle du site, mais cela fonctionne bien. Je suppose que le problème se situe ailleurs, je voudrais corriger ce problème mais je ne sais pas où wordpress décide s'il déclenche la 404 et je ne sais pas quel fichier php se déclenche le/page/2 car il semble que c'est pas index.php

1
Stephan S.

Comme vous le savez probablement, lors du chargement/du rendu d'une page, WordPress tente d'identifier la page demandée en analysant la chaîne de requête et en la comparant à une liste de modèles d'expression régulière. Par exemple, la chaîne de requête /page/2/ sera comparée à une page n ° 2 de la page de couverture, étant donné que page_on_front est défini sur false (paramètre "page unique ou liste de publications") et qu'il existe un nombre suffisant de publications d'une seconde. page est nécessaire. Dans le cas contraire, WordPress redirigera vers la page 404 et renverra un code d'état HTTP 404.

Tout cela se passe dans WP_Query::parse_query() . Regardez spécifiquement la ligne 1670 où l’objet de requête est marqué 404 en cas d’erreur lors de l’exécution de la requête.

À mon avis, dans votre cas, la requête initiale exécutée automatiquement par WordPress ne correspond pas à la requête que vous exécutez vous-même, c’est-à-dire que WordPress recherche des publications avec un décalage de page 2 pendant que vous souhaitez charger des publications correspondant à votre requête de recherche personnalisée.

Je dirais que votre meilleure option pour contourner cela est1. en vous assurant que votre requête personnalisée s'exécute en premierquoi que soit ou2. empêchant WordPress de retourner 404dans ce cas particulier.

1. Assurez-vous que votre requête personnalisée s'exécute en premierCeci peut être fait en ajoutant le code suivant (non testé) dans un plugin ou votre themes functions.php:

function my_default_query() {
    // Conditions required for running your custom query
    if (is_home() || is && isset($_GET['s'])) {
        query_posts(array(
            // your custom query arguments here
        ));
    }
}
add_action('init', 'my_default_query');

2. empêcher WordPress de renvoyer 404Il est probablement possible d'y parvenir en utilisant un filtre sur certaines des valeurs calculées dans WP_Query::parse_query(), mais elles ne sont malheureusement pas très faciles à trouver et peuvent être "masquées" derrière des appels de fonction effectués dans parse_query(). Si cela vous demande trop de travail ou si cela n’est pas possible, vous pourriez probablement simplement changer la valeur de $is_404 dans l’objet global WP_Query.

function my_override_404() {
    // Conditions required for overriding 404
    if (is_home() || is && isset($_GET['s'])) {
        global $wp_query;
        $wp_query->is_404 = false;
    }
}
add_action('init', 'my_override_404');

Et, comme l'a écrit Tom J Nowell, index.php n'est probablement pas le modèle approprié à utiliser dans ce cas, et résoudra probablement votre problème seul. Publier cette réponse quand même car cela pourrait vous aider/aider d’autres personnes à des situations similaires.

0
Simon