web-dev-qa-db-de.com

Wordpress löst 404 auf Seite 2 für benutzerdefinierte Suchabfragen aus

Ich habe meine index.php geändert, um zu überprüfen, ob die Suchanfrage ein Autor ist, und wenn ja, Artikel dieses Autors anzuzeigen. Das funktioniert gut, aber sobald Sie auf Seite 2 der Ergebnisse gehen, löst WordPress einen 404-Fehler aus. Ich vermute, Wordpress ruft die Datei index.php nicht auf http://www.test.com/page/2/?s=my+search+query auf und ich muss auch den Code, den ich erhalten habe, in meine Datei einfügen index.php woanders, aber wo?

Bearbeiten: Mein Code für die benutzerdefinierte Abfrage

$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()){
...

$ paged und $ offset werden überall berechnet, aber das funktioniert einwandfrei. Ich schätze, das Problem liegt woanders. Ich würde das gerne debuggen, aber ich weiß nicht, wo WordPress entscheidet, ob es den 404 auslöst, und ich weiß nicht, welche PHP-Datei auf/page/2 ausgelöst wird, weil es so aussieht nicht index.php

1
Stephan S.

Wie Sie wahrscheinlich wissen, versucht WordPress beim Laden/Rendern einer Seite zu ermitteln, welche Seite angefordert wird, indem die Abfragezeichenfolge analysiert und mit einer Liste von Regex-Mustern abgeglichen wird. Beispielsweise wird die Abfragezeichenfolge /page/2/ mit einer Seite # 2 der Titelseite abgeglichen, vorausgesetzt, page_on_front ist auf false gesetzt (dies ist die Einstellung "einzelne Seite oder Beitragsliste") und es gibt eine ausreichende Anzahl von Beiträgen pro Sekunde Seite wird benötigt. Ist dies nicht der Fall, leitet WordPress stattdessen zur 404-Seite weiter und gibt einen HTTP 404-Statuscode zurück.

All dies geschieht in WP_Query::parse_query() . Sehen Sie sich insbesondere die Zeile 1670 an, in der das Abfrageobjekt als 404 markiert ist, wenn beim Ausführen der Abfrage ein Fehler aufgetreten ist.

Vermutlich stimmt die von WordPress automatisch ausgeführte erste Abfrage nicht mit der von Ihnen ausgeführten Abfrage überein, d. H. WordPress sucht nach Posts mit einem Offset von Seite 2, während Sie Posts laden möchten, die Ihrer benutzerdefinierten Suchabfrage entsprechen.

Ich würde sagen, Ihre besten Möglichkeiten, dies zu umgehen, sind1. Stellen Sie sicher, dass Ihre benutzerdefinierte Abfrage zuerst ausgeführt wird.egal was oder2. Verhindern, dass WordPress 404 zurückgibtin diesem speziellen Fall.

1. Stellen Sie sicher, dass Ihre benutzerdefinierte Abfrage zuerst ausgeführt wird.Dies kann durch Hinzufügen des folgenden (nicht getesteten) Codes in einem Plugin oder in Ihren Designs functions.php erfolgen:

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. Verhindern, dass WordPress 404 zurückgibtDies kann möglicherweise durch die Verwendung eines Filters für einige der in WP_Query::parse_query() berechneten Werte erreicht werden. Sie sind jedoch leider nicht leicht zu finden und können sich hinter Funktionsaufrufen in parse_query() "verstecken". Wenn das zu viel Arbeit ist oder nicht möglich, können Sie wahrscheinlich einfach den Wert von $is_404 für das globale Objekt WP_Query ändern.

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

Und, wie Tom J Nowell schrieb, ist index.php wahrscheinlich nicht die geeignete Vorlage für diesen Fall und wird wahrscheinlich nur Ihr Problem beheben. Poste diese Antwort trotzdem, da sie dir/anderen in ähnlichen Situationen helfen könnte.

0
Simon