wordpress custom-post-types – Relaciones ACF en el tipo de publicación personalizada Enlace permanente

Pregunta:

Mi problema es uno al que parece que no puedo encontrar una solución.

Tengo 2 tipos de publicaciones personalizadas, Mangas y Chapters , cada capítulo publicado siempre estará conectado a un manga a través del campo de relación ACF.

La estructura actual de site.com/chapters/chapter-title permanentes para el capítulo es site.com/chapters/chapter-title y lo que quiero es site.com/mangas/connected-manga/chapter-title

Dado que wordpress no ofrece mucho en cuanto a relaciones de publicación a publicación, el campo de relación de ACF es excelente para esto y tengo todo resuelto excepto esto … el enlace permanente.

Cualquier ayuda sería apreciada. Tenga en cuenta que no quiero utilizar un complemento adicional para esto.

Respuesta:

Puede agregar lo siguiente como complemento o en el archivo functions.php sus temas. Lo que tenemos que hacer es agregar una etiqueta de reescritura, una variable de consulta personalizada y, finalmente, reemplazar la etiqueta de reescritura con el slug de publicación relacionado. Algunas cosas pueden variar de mi código al tuyo. Supongo que los chapters son el tipo de publicación slug y que el campo relacional devuelve una ID en lugar de un objeto, es posible que deba cambiar estas cosas según su configuración.

Una cosa que deberá hacer es cuando esté creando el tipo de publicación de sus chapters , deberá agregar el marcador de posición en la barra de reescritura:

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

Este último bit debería redirigir cualquier publicación que no coincida. Nos aseguramos de tener una babosa con la que trabajar, tenemos una ID de publicación relacionada asignada, y la babosa dada y la babosa de publicación relacionada son las mismas, si no lo están, las redirigimos a la página de archivo (o donde sea debe señalarlos).

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

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım