wake-up-neo.com

add_rewrite_rule funktioniert nicht für die Seite var

Ich habe eine Seite mit dem Namen mypage und eine benutzerdefinierte Abfragevariable mit dem Namen mycustomvar. Ich versuche, die folgende URL umzuschreiben:

http://example.com/index.php?name=mypage&mycustomvar=someword

zu

http://example.com/mypage/someword

mit

add_rewrite_rule( '^mypage/([^/]+)/?', 'index.php?name=mypage&mycustomvar=$matches[1]', 'top' );

Aber alles was ich bekomme ist:

http://example.com/mypage/?mycustomvar=someword

in der url zeigen. Ich habe auch versucht, beide hinzuzufügen

add_rewrite_tag( '%mycustomvar%', '([^/]+)' );

stellen Sie außerdem sicher, dass mycustomvar über den query_vars-Filter zu meinen benutzerdefinierten Abfragevariablen hinzugefügt wird

(und ich habe verschiedene Kombinationen mit und ohne Seitennamen ausprobiert und page oder pagename anstelle von name verwendet, alle ohne Glück)

3
Stephen

OK, lassen Sie uns zunächst einige endgültige Erläuterungen zu den richtigen Abfragevarianten geben.

Siehe Post- und Seitenparameter auf der Codexseite WP_Query.

name (string) - benutze post slug.

seitenname (Zeichenfolge) - Verwenden Sie Seiten-Slug.

Wir können dies mit WP_Query bestätigen:

$args = array(
    'name' => 'mypage'
);
$mypage = new WP_Query( $args );

echo '<pre>';
print_r( $mypage );
echo '</pre>';

was produzieren wird:

SELECT wp_posts.*
FROM wp_posts
WHERE 1=1
AND wp_posts.post_name = 'mypage'
AND wp_posts.post_type = 'post'
ORDER BY wp_posts.post_date DESC

Es wird nach mypage slug im Post-Typ post gesucht. Wenn wir dies in pagename ändern, sieht es nach dem Beitragstyp page aus.

Der Grund, warum Art von bei der Hauptabfrage mit name funktioniert, liegt in der Funktion redirect_guess_404_permalink , die aktiviert wird, wenn die ursprüngliche Anfrage eine 404 ist dort umleiten, wenn etwas gefunden wird. Dies führt auch dazu, dass zusätzliche Parameter von der URL entfernt werden.

Bei hierarchischen Beitragstypen ist Folgendes zu beachten: Wenn Ihre Seite ein untergeordnetes Element einer anderen Seite ist, müssen Sie die Abfragevariable pagename mit dem Pfad parent/child festlegen, da verschiedene Eltern untergeordnete Elemente mit demselben Slug haben können.

Was Ihre Frage betrifft, funktioniert das Ändern der Abfragevariable in pagename mit Ihrem ursprünglichen Code in Version 4.7.2 und dem Twenty Sixteen-Thema:

function wpd_mypage_rewrite() {
    add_rewrite_tag(
        '%mycustomvar%',
        '([^/]+)'
    );
    add_rewrite_rule(
        '^mypage/([^/]+)/?',
        'index.php?pagename=mypage&mycustomvar=$matches[1]',
        'top'
    );
}
add_action( 'init', 'wpd_mypage_rewrite' );

Beachten Sie, dass ich hier add_rewrite_tag verwendet habe. Sie könnten stattdessen den query_vars-Filter verwenden. Der Grund, warum add_rewrite_tag funktioniert, ist, dass er die Abfragevariable intern über denselben Filter hinzufügt.

Vergessen Sie nicht, umgeschriebene Regeln zu löschen nachdem Sie Regeln hinzugefügt/geändert haben. Sie können dies auch tun, indem Sie die Seite Einstellungen> Permalinks aufrufen.

Sie können dann in der Vorlage echo get_query_var( 'mycustomvar' ); angeben, und der Wert wird ausgegeben.

2
Milo

UGH Ich (vielleicht) habe es gerade herausgefunden. Ich brauchte meine Variable nicht, um einen Namen zu haben, sondern nur einen Ort.

So hat es funktioniert:

add_rewrite_rule( '^mypage/([^/]+)/?', 'index.php?pagename=mypage&$matches[1]', 'top' );

JETZT lädt meine Seite die URL richtig:

http://example.com/mypage/someword

Trotzdem habe ich jetzt keine andere Möglichkeit als die URL-Platzierung, um meine Variable someword zu lesen und etwas damit zu tun, aber ich denke, das ist gut genug, es sei denn, jemand kann mich auf einen besseren Weg hinweisen, der es mir ermöglicht, diese Variable anhand ihrer abzufragen Name....

0
Stephen