Benutzerdefinierter Post-Typ-Permalink-Endpunkt

8

Ich habe einen benutzerdefinierten Beitragstyp namens "Ziele" und die EP-Maske für den Beitragstyp auf "Standard 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 jetzt an einem normalen Beitrag teste, wird es zu der Vorlage weitergeleitet, für die ich es benötige (ich habe eine Vorlagenumleitung für den einzelnen Vorlagenhaken).

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 bleibt in der Vorlage single-destination.php

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 stundenlang damit zu kämpfen und keine Ergebnisse :(

Vielen Dank

Charl Pretorius
quelle

Antworten:

25

Ein paar Dinge. Zunächst müssen Ihren Funktionsnamen etwas Einzigartiges vorangestellt werden. WordPress ist ein großes Ökosystem, und wahrscheinlich hat jemand anderes alle generischen Funktionsnamen verwendet, die Sie sich vorstellen können.

Zweitens add_rewrite_endpointkümmert sich 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 Regeln für das Umschreiben bei jeder Ladung zu spülen. Dies muss nur einmal durchgeführt werden, nachdem Ihre Regeln hinzugefügt wurden. Wie bei der Plugin-Aktivierung. Ihre add_endpointsFunktion könnte also kurzgeschlossen werden (mit einem besseren Funktionsnamen pro Punkt eins 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 EP_PAGESEndpunktmaske 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 für Sie immer noch nicht wie erwartet funktionieren. 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 nichts folgt activities, 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 requestden Wert Ihrer Touren- und Aktivitätsvariablen filtern und in true ändern, wenn sie 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 dieses Handbuch zur von mir geschriebenen Rewrite-API ansehen . Die relevanten Teile für Ihre Frage sind jedoch oben zusammengefasst.

chrisguitarguy
quelle
1
Danke für die tolle Antwort! Ich habe die Änderungen gemäß Ihrem Beitrag und Leitfaden vorgenommen. Aber es scheint, dass WordPress den Endpunkt und alle Variablen nach dem Laden der URL umleitet / entfernt. Ich bin mir nicht sicher, ob es eine kanonische Weiterleitung ist oder was. Es werden jedoch nur die registrierten Endpunkte entfernt. Wenn ich am Ende der URL etwas Arb hinzufüge, erhalte ich eine 404. Touren oder Aktivitäten werden jedoch entfernt oder zur einzelnen Ziel-URL weitergeleitet. :(
Charl Pretorius
1
Es scheint, ich habe das Problem gefunden. Hat mit den Permalink-Einstellungen zu tun. Ich hatte eine benutzerdefinierte Einstellung - /% Kategorie% /% Postname% /. Aber wenn ich es auf /% postname% / setze, funktioniert es noch nicht, warum, aber ich werde es mir ansehen. Danke \ 0 /
Charl Pretorius
1
Sie sollten versuchen, es jetzt wieder auf /% category% /% postname% / umzustellen, und es könnte wieder funktionieren. Ich vermute, der Grund, warum WP Ihre Sachen entfernt hat, war, dass Sie die Umschreiberegeln löschen mussten. (Vielleicht.)
Chrisguitarguy
1
Ich hatte auch eine benutzerdefinierte Permalink-Einstellung. Ich ging einfach zu Permalinks-Einstellungen und klickte auf Änderungen speichern, ohne etwas zu ändern, und dann funktionierte der Endpunkt.
Yitwail
Das hilft mir sehr! Vielen Dank Bruder!
Fdrv