it-swarm.com.de

Dynamische Endpunkte

Ich habe eine Datenbanktabelle außerhalb von WordPress, für die ich Endpunkte erstellen muss. Ich habe eine Seite /cars/ erstellt, 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 basierend auf der aus der Modelltabelle gezogenen Schnecke dynamisch machen sollte. Ich war mir auch nicht sicher, ob die Verwendung von Permalink Structure-Tags einfacher oder besser wäre.

Ich bin mir nicht einmal ganz sicher, wo ich anfangen soll. Ich habe zuvor "statische" Endpunkte erstellt, sodass ich eine Basis zum Abspringen hatte, aber wenn ich zum Filter request komme, bin ich 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 es mir, meine template_include (weshalb ich die Variable model_template hinzugefügt habe), aber die URL wird nicht neu geschrieben. Also fing ich an mit add_rewrite_rule() zu spielen

/**
 * 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 gelöscht, aber die Neuschreibungen scheinen nicht zu wirken. Ich kann nur annehmen, dass etwas mit der Schreibweise der Regel nicht stimmt.


Benötige ich beide den Endpunkt und die Umschreiberegel oder nur eine der beiden? Mache ich alles falsch? Wie kann ich die Permalink-Struktur von /cars/camaro/ erreichen?

7
Howdy_McGee

10up Engineering Best Practices als gutes Beispiel dafür, wie dies erreicht werden kann. Sie fügen im Grunde genommen ein neues Umschreibetag und eine neue Umschreiberegel hinzu und geben dann mithilfe 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, die Permalinks zu löschen, bevor Sie Ihren neuen Endpunkt testen! Wp-cli benutzen:

wp rewrite flush

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

5
jonathanbardo