it-swarm.com.de

Benutzerdefinierter Endpunkt für Permalink-Posts

Ich habe einen benutzerdefinierten Post-Typ namens "Destinations" und die EP-Maske für den Post-Typ auf "Default EP_PERMALINK" gesetzt. Ich habe einige Endpunkte wie folgt hinzugefügt:

add_filter( 'query_vars', 'add_query_vars');

function add_query_vars($vars){
    $vars[] = "tours";
    $vars[] = "activities";
    return $vars;
}

add_action('init', 'add_endpoints');

function add_endpoints(){
    global $wp_rewrite; 

    add_rewrite_endpoint('tours', EP_PERMALINK);
    add_rewrite_endpoint('activities', EP_PERMALINK);

    $wp_rewrite->flush_rules();
}

Wenn ich dies nun auf einem normalen Beitrag teste, leitet es zu der Vorlage weiter, die ich benötige (ich habe eine Vorlagenumleitung für den einzelnen Vorlagen-Hook).

dh somesite.com/test-category/test/activities/

Für den Post-Typ (der hierarchisch ist) wird jedoch nur der Endpunkt aus der URL entfernt und die single-destination.php-Vorlage beibehalten

dh somesite.com/destination/south-africa/kruger-national-park/activities/

wird

somesite.com/destination/south-africa/kruger-national-park/

Jede Hilfe oder Anleitung wird sehr geschätzt. Ich habe seit Stunden damit zu kämpfen und keine Ergebnisse :(

Vielen Dank

8
Charl Pretorius

Ein paar Dinge. Zunächst müssen Ihre Funktionsnamen mit einem eindeutigen Präfix versehen werden. WordPress ist ein großes Ökosystem, und jemand anderes hat wahrscheinlich alle generischen Funktionsnamen verwendet, die Sie sich vorstellen können.

Zweitens übernimmt add_rewrite_endpoint das Hinzufügen von Abfragevariablen für Sie. Das brauchst du also nicht:

add_filter( 'query_vars', 'add_query_vars');
function add_query_vars($vars){
    $vars[] = "tours";
    $vars[] = "activities";
    return $vars;
}

Es ist keine gute Idee, die Umschreiberegeln für jede Ladung zu spülen. Dies muss nur einmal durchgeführt werden, nachdem Ihre Regeln hinzugefügt wurden. Wie bei der Aktivierung des Plugins. Daher könnte Ihre add_endpoints Funktion mit dieser Funktion kurzgeschlossen werden (mit einem besseren Funktionsnamen pro Punkt 1 oben).

<?php
add_action('init', 'wpse42279_add_endpoints');
function wpse42279_add_endpoints()
{
    add_rewrite_endpoint('tours', EP_PERMALINK);
    add_rewrite_endpoint('activities', EP_PERMALINK);
}

Welches funktioniert gut für Beiträge. Wenn Sie möchten, dass es auf Seiten oder einem anderen hierarchischen Beitragstyp funktioniert, müssen Sie die Endpunktmaske EP_PAGES verwenden.

<?php
add_action('init', 'wpse42279_add_endpoints');
function wpse42279_add_endpoints()
{
    add_rewrite_endpoint('tours', EP_PAGES);
    add_rewrite_endpoint('activities', EP_PAGES);
}

Aber das wird immer noch nicht so funktionieren, wie Sie es erwartet haben. Endpunkte setzen ihre Abfragevariable gleich dem, was danach kommt. Also, wenn Ihre URL ist ...

yoursite.com/some-country/some-city/activities/asdf

die Aktivitäten der Abfragevariablen lauten asdf. Wenn auf activities nichts folgt, ist Ihre Abfragevariable leer (aber gesetzt), sodass sie immer als falsch ausgewertet wird, wenn Sie versuchen, sie abzufangen ...

<?php
add_action( 'template_redirect', 'wpse42279_catch_vars' );
function wpse42279_catch_vars()
{
    if( get_query_var( 'tours' ) )
    {
        // do stuff!
        exit();
    }
}

Sie können dies umgehen, indem Sie request filtern und den Wert Ihrer Touren- und Aktivitätsvariablen in true ändern, sofern diese festgelegt sind.

<?php
add_filter( 'request', 'wpse42279_filter_request' );
function wpse42279_filter_request( $vars )
{
    if( isset( $vars['tours'] ) ) $vars['tours'] = true;
    if( isset( $vars['activities'] ) ) $vars['activities'] = true;
    return $vars;
}

Sie sollten sich diesen Leitfaden zur Rewrite-API ansehen den ich geschrieben habe. Die relevanten Teile für Ihre Frage sind jedoch oben zusammengefasst.

24
chrisguitarguy