web-dev-qa-db-ja.com

カスタム投稿型パーマリンクにおけるACFの関係

私の問題は私が解決策を見つけることができないようなものです。

私は2つのカスタム投稿タイプMangasChaptersを持っています。出版されたすべての章は 常に ACFリレーションフィールドを介してマンガに接続されます。

この章の現在のパーマリンク構造はsite.com/chapters/chapter-titleで、欲しいのはsite.com/mangas/connected-manga/chapter-titleです。

WordPressは投稿間の関係をあまり提供していないので、ACFの関連フィールドはこれに最適で、私はこれを除いてすべてを考え出しました...パーマリンク。

任意の助けがいただければ幸いです。私はこれのために余分なプラグインを使いたくないということを心に留めておいてください。

3
ACast59

以下は、プラグインとして、またはテーマのfunctions.phpファイルに追加できます。私たちがする必要があるのは、書き換えタグ、カスタムクエリvarを追加し、最後に書き換えタグを関連するポストスラッグに置き換えることです。いくつかのことは私のコードからあなたのものに変わるかもしれません。私はchaptersがポストタイプのスラッグであり、リレーショナルフィールドがオブジェクトではなくIDを返すと仮定します、あなたはあなたの設定に基づいてこれらを変更する必要があるかもしれません。

あなたがあなたがあなたのchapters投稿タイプを作成しているときあなたがする必要がある1つのことはあなたは書き換えスラッグのプレースホルダーに加える必要があるでしょう:

/**
 * 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 );

この最後のビットは、不一致の投稿をリダイレクトします。スラッグがあること、関連する投稿IDが割り当てられていること、および指定されたスラッグと関連する投稿スラグが同じであることを確認します。あなたがそれらを指す必要があります)。

/**
 * 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

私はあなたがプラグインを使用する必要があると思いますカスタム投稿タイプパーマリンクそれをするために

0
Amr Mohamed