Cómo usar una plantilla personalizada en URLs específicas

10 nov 2014, 17:37:12
Vistas: 3.49K
Votos: 1

Estoy construyendo un sitio simple con dos idiomas. Estoy usando Polylang para las entradas, y también tengo un tipo de contenido personalizado, "Artist". Para mantenerlo simple en el back-end, no estoy usando Polylang para esto, solo algunos campos personalizados para el idioma en cada artista.

Cuando cargo site.com/artist/johnny-cash estoy usando la plantilla single-artist.php en mi tema. La pregunta es, ¿cómo podría hacer para cargar una plantilla personalizada cuando accedo, por ejemplo, a site.com/en/artist/johnny-cash?

Básicamente, esto:

site.com/artist/johnny-cash -> Carga single-artist.php (perfecto)

site.com/en/artist/johnny-cash -> ¿Cómo redirijo a una plantilla personalizada?

7
Comentarios

¿cómo has hecho que ambas URLs apunten a tu tipo de entrada personalizado?

Milo Milo
10 nov 2014 17:53:54

No estoy seguro de haberte entendido (probablemente no me expliqué bien). Registré un tipo de entrada personalizado, y su slug es "artist", así que WP carga automáticamente single-artist.php cuando cargas /artist/john-doe

Ignacio Ignacio
10 nov 2014 17:56:32

¿y cómo hace que al visitar esa URL con /en/ al principio también se muestre tu tipo de entrada personalizado? ¿o actualmente da un error 404?

Milo Milo
10 nov 2014 17:59:26

En este momento, redirige a la misma página sin /en/, como /artist/johnny-cash. No tengo idea de por qué. Pensé que debería mostrar un error 404, pero no...

Ignacio Ignacio
10 nov 2014 18:00:52

WordPress intenta encontrar lo que querías cargar antes de devolver un 404, y redirige a eso. Así que tienes un paso adicional antes de poder manejar las plantillas, y es agregar reglas de reescritura para que esas solicitudes /en/ carguen el objeto correcto.

Milo Milo
10 nov 2014 18:05:27

@Milo Gracias. ¿Podrías indicarme alguna documentación o ejemplo sobre algo similar?

Ignacio Ignacio
10 nov 2014 18:08:57

Si buscas add_rewrite_rule aquí encontrarás muchos ejemplos. No tengo tiempo para escribir el código en este momento, pero puedo orientarte en una dirección. Cuando agregues la regla de reescritura para manejar las solicitudes de tu tipo de contenido personalizado con /en/, también puedes agregar una variable de consulta adicional, para que puedas identificar esas solicitudes por separado de las solicitudes sin en. Luego puedes filtrar single_template, verificar esa variable de consulta y cargar una plantilla especial en ese caso.

Milo Milo
10 nov 2014 18:12:17
Mostrar los 2 comentarios restantes
Todas las respuestas a la pregunta 1
1

Gracias a @Milo en los comentarios, voy a publicar mi respuesta:

Primero agregué esta regla:

add_rewrite_rule(  
    "en/artist/([^/]+)/?",  
    'index.php?pagename=post_type=artist&artist=$matches[1]&gal_template=en',
    "top"); 

Luego este filtro:

add_filter( 'query_vars', 'gal_query_vars' );
function gal_query_vars( $query_vars )
{
    $query_vars[] = 'gal_template';
    return $query_vars;
}

Finalmente, filtré la plantilla single:

add_filter( 'single_template', 'get_custom_post_type_template' );
function get_custom_post_type_template($single_template) {
     global $post;

     if ($post->post_type == 'artist') {

            $q = get_query_var('gal_template');

            if ($q === 'en') {
                $single_template = dirname( __FILE__ ) . '/single-artist-en.php';
            }

     }
     return $single_template;
}

Luego en single-artist-en.php hice:

get_template_part('single-artist')

Pero podrías hacer lo que necesites.

10 nov 2014 19:28:38
Comentarios

Aquí está la solución actual y completa de WordPress: https://codex.wordpress.org/Rewrite_API/add_rewrite_rule

Imran Zahoor Imran Zahoor
12 sept 2015 20:18:15