web-dev-qa-db-fra.com

Relations ACF dans le type de message personnalisé Permalink

Mon problème est celui pour lequel je n'arrive pas à trouver une solution.

J'ai 2 types de messages personnalisés, Mangas et Chapters, chaque chapitre publié sera toujours connecté à un manga via le champ de relation ACF.

La structure actuelle du lien permanent pour ce chapitre est site.com/chapters/chapter-title et ce que je veux, c'est site.com/mangas/connected-manga/chapter-title

Puisque wordpress n'offre pas beaucoup de relations post-à-post, le champ relationnel d'ACF est idéal pour cela et j'ai tout prévu, à l'exception de celui-ci ... le lien permanent.

Toute aide serait appréciée. S'il vous plaît gardez à l'esprit que je ne veux pas utiliser un plugin supplémentaire pour cela.

3
ACast59

Vous pouvez ajouter ce qui suit sous forme de plug-in ou dans votre fichier de thèmes functions.php. Ce que nous devons faire, c'est ajouter une balise de réécriture, une requête personnalisée, et enfin remplacer la balise de réécriture par le message correspondant. Certaines choses peuvent varier de mon code au vôtre. Je suppose que chapters est le slug de type publication et que le champ relationnel renvoie un ID au lieu d'un objet, vous devrez peut-être modifier ces éléments en fonction de votre configuration.

Lorsque vous créez votre type de message chapters, vous devez notamment ajouter l’espace réservé sur le slug de réécriture:

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

Ce dernier bit devrait rediriger les publications incompatibles. Nous nous assurons de travailler avec un slug, nous avons un identifiant de post associé, et le slug donné et le slug correspondant sont identiques, s'ils ne le sont pas, nous les redirigeons vers la page des archives vous devez les indiquer).

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

Je pense que vous devez utiliser le pluginType de message personnalisé Permalienspour le faire

0
Amr Mohamed