Dynamische Endpunkte

8

Ich habe eine Datenbanktabelle außerhalb von WordPress, für die ich Endpunkte erstellen muss. Ich habe eine Seite erstellt, /cars/auf der ich mithilfe einer Seitenvorlage Links generieren möchte. Ich möchte, dass die URL wie folgt aussieht /cars/camaro/( /cars/%model%/). Ursprünglich dachte ich, ich könnte es mit Endpunkten machen, war mir aber nicht sicher, wie ich sie dynamisch machen sollte, basierend auf der aus der Modelltabelle gezogenen Schnecke. Ich war mir auch nicht sicher, ob es einfacher wäre, Permalink Structure-Tags zu verwenden, oder welches besser war.

Ich bin mir nicht einmal ganz sicher, wo ich anfangen soll. Ich habe zuvor "statische" Endpunkte erstellt, sodass ich eine Basis hatte, von der ich springen konnte, aber wenn ich zum requestFilter komme, bin ich mir nicht sicher, was ich tun soll.

/**
 * Add endpoint to handle models
 */
function theme_endpoints() {
    add_rewrite_endpoint( 'cars', 'EP_PAGES' );     // Since cars is our base
}
add_action( 'init', 'theme_endpoints' );

/**
 * Filter request variables
 * @param array $vars
 * @return array $vars
 */
function theme_perma_requests( $vars ) {

    if( isset( $vars['model'] ) ) {
        $vars['model_template'] = true;
    }

    return $vars;
}
add_filter( 'request', 'theme_perma_requests' );

Ich meine, dies ermöglicht mir mein template_include (weshalb ich die model_templateVariable hinzugefügt habe ), aber die URL wird nicht neu geschrieben. Also fing ich an zu spielenadd_rewrite_rule()

/**
 * Theme rewrite rules
 */
function theme_rewrite_rules() {
    add_rewrite_rule( '^cars/([^/]*)/?$', 'index.php?page_id=8&model=$matches[0]', 'top' );
}
add_action( 'init', 'theme_rewrite_rules' );

Ich habe meine Permalinks geleert, aber die Umschreibungen scheinen nicht wirksam zu sein. Ich kann nur annehmen, dass etwas mit der Schreibweise der Regel nicht stimmt.


Benötige ich sowohl den Endpunkt als auch die Umschreiberegel oder nur eine der beiden? Gehe ich alles falsch? Wie kann ich die Permalink-Struktur von erreichen /cars/camaro/?

Howdy_McGee
quelle
Ich habe nicht viel Erfahrung damit, aber ich denke, das add_rewrite_tag()ist ein guter Ausgangspunkt.
Sisir

Antworten:

6

10up Engineering Best Practices als gutes Beispiel dafür, wie dies erreicht werden kann. Sie fügen im Grunde ein neues Umschreibetag und eine neue Umschreiberegel hinzu und geben dann mit der Aktion template_redirect Ihre benutzerdefinierte Aktion zurück.

Hier ist der Code:

add_action( 'init', function() {
  add_rewrite_tag( '%model%', '([^/]+)' );
  add_rewrite_rule( 'cars/([^/]+)/?', 'index.php?model=$matches[1]', 'top' );
} );

add_action( 'template_redirect', function() {
  global $wp_query;

  $model = $wp_query->get( 'model' );

  if ( ! empty( $model ) ) {
    // Return stuff here
  }
} );

Vergessen Sie nicht, Permalinks zu leeren, bevor Sie Ihren neuen Endpunkt ausprobieren! Verwenden von wp-cli:

wp rewrite flush

Oder verwenden Sie die Admin-Benutzeroberfläche: http: //example.local/wp-admin/options-permalink.php und klicken Sie auf Speichern.

Jonathanbardo
quelle
Ich vergaß, dass diese Frage existierte und stieß erneut auf eine Lösung. Scheint so, als ob dies völlig funktioniert - sauber, einfach und überraschend überraschend. Hat 10up ein Tutorial dazu, auf das Sie verlinken können? Danke vielmals!
Howdy_McGee
Vielen Dank für diese Lösung. Es ist absolut das, wonach ich gesucht habe. Aber ich brauche nur ein bisschen mehr Hilfe bei meinem Thema. Im Moment sendet diese Regel den Benutzer an meine index.php, während ich möchte, dass der Benutzer auf einer bestimmten Seite landet und einfach den Querystring-Parameter verwendet. Beispiel: mywebsite.com/parentpage/childpage/somevalue/, um tatsächlich zu gehen: mywebsite.com/parentpage/childpage/ und "somevalue" werden als Variable auf dieser Seite verwendet. Kann dies mit dieser Methode erreicht werden? Vielen Dank!
Shir Gans