Supondo que sua taxonomia personalizada é chamada de artist
(e você não substitui o slug no parâmetro rewrite
), é possível usar a tag de reescrita %artist%
. O WordPress implementa quase todas as funcionalidades para usar essas tags de reescrita em permalinks de postagens. Existem apenas algumas pequenas adaptações necessárias.
Construindo o Permalink
Primeiro, você precisará usar o filtro post_link
para substituir uma "tag" personalizada na sua estrutura de solicitações:
/**
* 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 função ( wpse_56769_post_link
):
- define um slug de termo padrão (
no_artist
) que é usado como fallback se a postagem não tiver termos atribuídos na taxonomia do artista, - obtém o primeiro termo atribuído (em ordem alfabética) da taxonomia do artista,
- substitui a tag
%artist%
pelo slug desse termo.
Agora, vá para o menu Configurações → Permalinks, escolha a opção "Estrutura Personalizada" e escreva: /%artist%/%postname%/
.
No resultado, um permalink de postagem deve ter esta aparência:
Agora que a postagem permalinks inclui o primeiro termo de artista, vamos dar uma olhada no roteiro.
Atualize os permalinks (roteamento)
Você notará que o permalink foi resolvido corretamente para a postagem única. Infelizmente, os permalinks da página estão corrompidos.
Para resolver este problema, você não precisa necessariamente alterar as regras de reescrita. A única coisa que precisamos fazer é mudar o estado interno de WP_Rewrite
. A propriedade WP_Rewrite::use_verbose_page_link
precisa ser definida como TRUE
. (Esse é o comportamento interno de WP_Rewrite
ao usar %category%
ou %author%
tags como base para pós-permalinks).
/**
* 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 );
O estado precisa ser alterado em dois pontos: do_parse_request
porque WP::parse_request()
solicita este estado e page_rewrite_rules
para quando as regras de reconfiguração são criadas.
Agora, o roteamento é fixo e os permalinks de páginas funcionam bem. (Depois de lavar os permalinks mais uma vez.)
Lidar com o pseudo termo no_artist
Uma última coisa na coisa no_artist
: se a postagem realmente não estiver atribuída a nenhum termo da artist
taxonomy, o permalink será analisado para as seguintes variáveis de consulta:
name => 'sample_post'
artist => 'no_artist'
page => ''
Isso deve levar a um erro 404 porque o termo não existe. Como o name
da postagem deve ser exclusivo, podemos remover a variável de consulta artist
no 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' );
Com esse filtro, uma postagem como http://wordpress.dev/no_artist/sample-post/
será encontrada corretamente.