it-swarm.com.de

Mehrere Permalinks für denselben Beitrag

Ich möchte in der Lage sein, mehrere Permalinks für denselben zugrunde liegenden Beitrag zu haben (aus i18n Gründen) - z

http://www.example.com/my-custom-post-type/this-is-a-cool-article
http://www.example.com/mon-type-de-poste-personnalise/cest-un-article-sympa

Beide verweisen auf dieselbe Beitragsseite. Eingebaute WP i18n-Funktionen würden sich mit der Sprachumschaltung auf der Postseite selbst befassen. Ich bin mehr mit der URL-Anzeige für SEO und Endbenutzerästhetik beschäftigt.

Ich kann keine 301-Umleitung verwenden, da die Browser-URL nicht geändert werden soll. Ich verstehe, wie man den benutzerdefinierten Post-Typ-Slug internationalisiert, aber nicht den tatsächlichen Post-Slug.

Ich denke, ich kann den sekundären Post-Slug in einem Post-Meta-Feld speichern, aber ich müsste mich irgendwo im Routing einhängen, um ihn zu aktivieren - ich hatte nicht viel Glück, den richtigen Ort zum Einhängen zu finden? Gibt es einen Ort, an dem man sich einklinken kann, oder einen einfacheren Weg, damit umzugehen?

2
Roscius

Das Anforderungs-Parsing wird in WP::parse_request() behandelt. Danach gibt es einen Aktions-Hook parse_request, der Ihnen die Instanz des Objekts wp gibt.

Wir gehen davon aus, dass http://www.example.com/my-custom-post-type/this-is-a-cool-article Ihr Permalink ist und http://www.example.com/mon-type-de-poste-personnalise/cest-un-article-sympa in einem 404 endet. Das erste, was Sie in Ihrem Rückruf überprüfen sollten, ist, ob sich das Objekt wp in einem Fehler-/404-Zustand befindet:

if ( ! empty( $wp->query_vars[ 'error' ] && 404 == $wp->query_vars[ 'error' ] ) {
    //…
}

Bearbeiten: Ich habe einen Fehler gemacht: Es ist nicht sicher, ob der Status von $wp in Ihrer Alias-URL immer 404 ist. Dies hängt stark von den Umschreiberegeln Ihres Systems ab. Sie müssen also direkt nach Ihrem Alias ​​cpt slug suchen.

Nun müssen Sie die Anfrage selbst analysieren und nach Ihrem Meta-Wert suchen, um den entsprechenden Beitrag zu finden:

if ( ! empty( $wp->query_vars[ 'error' ] && '404' == $wp->query_vars[ 'error' ] ) {

    //look up for your post, this var should looks like 
    // 'mon-type-de-poste-personnalise/cest-un-article-sympa' in your case:
    $wp->request;
    //e.g.
    $parts = explode( '/', $wp->request );
    // your language slug
    $slug = ( isset( $parts[ 1 ] ) ) ? $parts[ 1 ] : '';
    // do your query with your meta value $slug here

}

Als Nächstes richten Sie den $wp->query_vars so ein, wie es aussehen würde, wenn die ursprüngliche Anfrage gestellt würde:

if ( ! empty( $wp->query_vars[ 'error' ] && '404' == $wp->query_vars[ 'error' ] ) {

    //look up for your post, this var should looks like 
    // 'mon-type-de-poste-personnalise/cest-un-article-sympa' in your case:
    $wp->request;
    //e.g.
    $parts = explode( '/', $wp->request );
    // your i18n post slug
    $slug = ( isset( $parts[ 1 ] ) ) ? $parts[ 1 ] : '';
    // do your query with your meta value $slug here
    // and setup the WP_Post object for the matching post
    $matching_post; // WP_Post

    // if you don't find any post, return here!

    // unset the error flag
    unset( $wp->query_vars[ 'error' ] );

    // your cpt slug
    $cpt_slug = 'my-custom-post-type';

    $wp->query_vars[ $cpt_slug ] = $matching_post->post_name;
    $wp->query_vars[ 'post_type' ] = $cpt_slug;
    $wp->query_vars[ 'name' ] = $matching_post->post_name;
}

Als letztes müssen Sie verhindern, dass WordPress automatisch zur kanonischen URL umleitet, indem Sie die Funktion redirect_canonical aus der Aktion template_redirect entfernen:

if ( ! empty( $wp->query_vars[ 'error' ] && '404' == $wp->query_vars[ 'error' ] ) {

    //look up for your post, this var should looks like 
    // 'mon-type-de-poste-personnalise/cest-un-article-sympa' in your case:
    $wp->request;
    //e.g.
    $parts = explode( '/', $wp->request );
    // your language slug
    $slug = ( isset( $parts[ 1 ] ) ) ? $parts[ 1 ] : '';
    // do your query with your meta value $slug here
    // and setup the WP_Post object for the matching post
    $matching_post; // WP_Post

    # unset the error flag
    unset( $wp->query_vars[ 'error' ] );

    # your cpt slug
    $cpt_slug = 'my-custom-post-type';

    $wp->query_vars[ $cpt_slug ] = $matching_post->post_name;
    $wp->query_vars[ 'post_type' ] = $cpt_slug;
    $wp->query_vars[ 'name' ] = $matching_post->post_name;

    # don't redirect to the canonical url
    remove_action( 'template_redirect', 'redirect_canonical' );
}

Fügen Sie den letzten Codeblock in eine Funktion ein und wenden Sie ihn auf die Aktion parse_request an:

add_action( 'parse_request', 'wpse_126309_parse_request' );

/**
 * @wp-hook parse_request
 * @param WP $wp
 * @return void
 */
function wpse_126309_parse_request( $wp ) {
    // the code goes here
}

Sie sollten dieses Beispiel (es ist nicht mehr als ein Proof of Concept) auf Nebenwirkungen testen.

3
David