Suponiendo que su taxonomía personalizada se llama artist
(y no reemplaza la barra en el parámetro rewrite
) puede usar la etiqueta de reescritura %artist%
. WordPress implementa casi todas las funcionalidades para usar esas etiquetas de reescritura en post-enlaces permanentes. Solo se necesitan algunas pequeñas adaptaciones.
Construyendo el enlace permanente
Primero, deberá usar el filtro post_link
para reemplazar una "etiqueta" personalizada en su estructura de solicitud:
/**
* replace the '%artist%' tag with the first
* term slug in the artist taxonomy
*
* @wp-hook post_link
* @param string $permalink
* @param WP_Post $post
* @return string
*/
function wpse_56769_post_link( $permalink, $post ) {
$default_term = 'no_artist';
$terms = wp_get_post_terms( $post->ID, 'artist' );
if ( ! empty( $terms ) && ! is_wp_error( $terms ) )
$term = current( $terms )->slug;
else
$term = $default_term;
$permalink = str_replace( '%artist%', $term, $permalink );
return $permalink;
}
add_filter( 'post_link', 'wpse_56769_post_link', 10, 2 );
Esta función ( wpse_56769_post_link
):
- define un término predeterminado slug (
no_artist
) que se usa como reserva si la publicación no tiene términos asignados en la taxonomía del artista,
- busca el primer término asignado (en orden alfabético) de la taxonomía del artista,
- reemplaza la etiqueta
%artist%
con el slug de este término.
Ahora, vaya al menú Configuración → Permalinks, elija la opción »Estructura personalizada« y escriba: /%artist%/%postname%/
.
En el resultado, un mensaje de enlace permanente debería tener este aspecto:
Ahora que el enlace permanente de la publicación incluye la primera babosa del término de artista, echemos un vistazo al enrutamiento.
Actualizar los enlaces permanentes (enrutamiento)
Notarás que el enlace permanente se resuelve correctamente en la única publicación. Desafortunadamente, los permalinks de la página están rotos.
Para resolver este problema, no es necesario que altere las reglas de reescritura. Lo único que debemos hacer es cambiar el estado interno de WP_Rewrite
. La propiedad WP_Rewrite::use_verbose_page_link
debe establecerse en TRUE
. (Este es el comportamiento interno de WP_Rewrite
cuando se usan las etiquetas %category%
o %author%
como base para los enlaces permanentes de la publicación).
/**
* set WP_Rewrite::use_verbose_page_rules to TRUE if %artist%
* is used as the first rewrite tag in post permalinks
*
* @wp-hook do_parse_request
* @wp-hook page_rewrite_rules
* @global $wp_rewrite
* @param mixed $pass_through (Unused)
* @return mixed
*/
function wpse_56769_rewrite_verbose_page_rules( $pass_through = NULL ) {
$permastruct = $GLOBALS[ 'wp_rewrite' ]->permalink_structure;
$permastruct = trim( $permastruct, '/%' );
if ( 0 !== strpos( $permastruct, 'artist%' ) )
return $pass_through;
$GLOBALS[ 'wp_rewrite' ]->use_verbose_page_rules = TRUE;
return $pass_through;
}
add_filter( 'page_rewrite_rules', 'wpse_56769_rewrite_verbose_page_rules', PHP_INT_MAX );
add_filter( 'do_parse_request', 'wpse_56769_rewrite_verbose_page_rules', PHP_INT_MAX );
El estado se debe cambiar en dos puntos: do_parse_request
porque WP::parse_request()
solicita este estado y page_rewrite_rules
para cuando se construyen las reglas de reescritura.
Ahora, el enrutamiento es fijo y los enlaces de página funcionan bien. (Después de vaciar los permalinks una vez más.)
Manejar el pseudo término no_artist
Una última cosa sobre la cosa no_artist
: si la publicación realmente no está asignada a ningún término de la taxonomía artist
, el enlace permanente se analiza a las siguientes variables de consulta:
name => 'sample_post'
artist => 'no_artist'
page => ''
Esto debería llevar a un 404 porque el término no existe. Como el name
de la publicación debe ser único, podemos eliminar la variable de consulta artist
en el filtro request
:
/**
* check for existing artist and set query to 404 if necessary
*
* @wp-hook parse_query
* @param array $request_vars
* @return array
*/
function wpse_56769_request_vars( $request_vars ) {
if ( ! isset( $request_vars[ 'artist' ] ) )
return $request_vars;
if ( ! isset( $request_vars[ 'name' ] ) )
return $request_vars;
if ( 'no_artist' == $request_vars[ 'artist' ] )
unset( $request_vars[ 'artist' ] );
return $request_vars;
}
add_filter( 'request', 'wpse_56769_request_vars' );
Con ese filtro, una publicación como http://wordpress.dev/no_artist/sample-post/
se encontrará correctamente.