it-swarm.com.de

ACF-Beziehungen in benutzerdefinierten Beitragstypen Permalink

Mein Problem ist eines, für das ich scheinbar keine Lösung finde.

Ich habe 2 benutzerdefinierte Beitragstypen, Mangas und Chapters, jedes veröffentlichte Kapitel wird immer über das ACF-Beziehungsfeld mit einem Manga verbunden.

Die aktuelle Permalink-Struktur für das Kapitel ist site.com/chapters/chapter-title und ich möchte site.com/mangas/connected-manga/chapter-title

Da WordPress nicht viel in Bezug auf Post-to-Post-Beziehungen bietet, ist das ACF-Beziehungsfeld großartig dafür und ich habe alles herausgefunden, außer dies ... den Permalink.

Jede Hilfe wäre dankbar. Bitte beachten Sie, dass ich dafür kein zusätzliches Plugin verwenden möchte.

3
ACast59

Folgendes kannst du als Plugin oder in deine Themes functions.php Datei einfügen. Wir müssen lediglich ein Umschreibetag und eine benutzerdefinierte Abfragevariable hinzufügen und schließlich das Umschreibetag durch den zugehörigen Post-Slug ersetzen. Einige Dinge können von meinem Code zu Ihrem variieren. Ich gehe davon aus, dass chapters der Typ des Posts ist und dass das relationale Feld eine ID anstelle eines Objekts zurückgibt. Möglicherweise müssen Sie diese Änderungen basierend auf Ihrer Konfiguration vornehmen.

Eine Sache, die Sie tun müssen, ist, wenn Sie Ihren Beitragstyp chapters erstellen, den Sie in den Platzhalter auf dem Neuschreibungs-Slug einfügen müssen:

/**
 * Create Rewrite Tag
 * We'll be able to hook in and replace this placeholder
 * 
 * @return void
 */
function wpse285382_chapters_setup() {

    // Add rewrite tag
    add_rewrite_tag(
        '%manga%',  // Placeholder
        '([^&]+)',  // Regex
        'manga='    // Expected query var
    );

    // Assign rewrite tag in post registation
    register_post_type( 'chapters', array(
        /* ... */
        'rewrite' => array( 'slug' => 'mangas/%manga%', 'with_front' => false ),
        /* ... */
    ) );

}
add_action( 'init', 'wpse285382_chapters_setup' );


/**
 * Replace the placeholder rewrite tag with expected manga
 * 
 * @param String $post_link
 * @param WP_Post $post
 * 
 * @return String $post_link
 */
function wpse285382_chapter_link_replacements( $post_link, $post ) {

    // No Post ID? Drop out
    if( empty( $post ) ) {
        return $post_link;
    }

    // Make sure our post type is correct
    if( empty( $post ) || 'chapters' !== $post->post_type ) {
        return $post_link;
    }

    // Get related manga field
    $manga = get_field( 'related_manga', $post->ID );

    if( ! empty( $manga ) ) {

        // Grab Post Slug
        $manga_slug = get_post_field( 'post_name', $manga );

        // Replace rewrite tag in the given URL
        $post_link = str_replace( '%manga%', $manga_slug, $post_link );

    }

    return $post_link;

}
add_filter( 'post_type_link', 'wpse285382_chapter_link_replacements', 9, 2 );

Dieses letzte Bit sollte alle nicht übereinstimmenden Posts umleiten. Wir stellen sicher, dass wir einen Slug haben, mit dem wir arbeiten können, wir haben eine zugehörige Beitrags-ID zugewiesen, und der angegebene Slug und der zugehörige Beitrags-Slug sind gleich, wenn sie nicht von uns zurück zur Archivseite (oder wo auch immer) geleitet werden du musst sie darauf hinweisen).

/**
 * Redirect mismatched related posts
 * 
 * @return void
 */
function wpse285382_chapter_redirects() {

    global $post, $wp_query;

    if( ! is_singular( 'chapterss' ) ) {
        return;
    }

    $redirect_to    = get_post_type_archive_link( 'chapters' );
    $given_slug     = $wp_query->get( 'manga' );
    $expected_manga = get_field( 'related_manga', $post->ID );

    if( empty( $given_slug ) || empty( $expected_manga ) ) {
        wp_redirect( $redirect_to );
        exit();
    }

    $expected_slug = get_post_field( 'post_name', $expected_manga );

    if( $given_slug !== $expected_slug ) {
        wp_redirect( $redirect_to );
        exit();
    }

}
add_action( 'template_redirect', 'wpse285382_chapter_redirects' );
1
Howdy_McGee

Ich denke, Sie müssen PluginBenutzerdefinierte Post-Typ-Permalinksverwenden, um es zu tun

0
Amr Mohamed