Taxonomia Personalizada no Permalink of Post

4

É possível usar isso como um permalink para uma postagem:

/%category%/%postname%/

Mas digamos que eu criei uma taxonomia chamada "artista". Gostaria de usar isso para minhas postagens:

/%artist%/%postname%/

Eu sei que as taxonomias permitem que você liste seus termos com isso:

/%artist%/%someartist%/

mas não é isso que estou procurando. Eu quero modificar os URLs POST, não os de taxonomia.

Estou tentando isso no meu blog e não está funcionando. Isso é algo que pode ser feito no Wordpress?

    
por Totomobile 28.06.2012 / 05:25

3 respostas

6

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.

    
por David 26.09.2014 / 18:49
1

Acho que é isso que você está procurando: Permalinks de tipo de postagem personalizados

Este plugin permite que você edite a estrutura permalink do tipo de postagem personalizada.

Para instalar este plug-in:

  1. Faça o download do arquivo custom-post-type-permalinks.zip para o seu computador.
  2. Descompacte o arquivo.
  3. Faça o upload do diretório permalink de tipos de postagem personalizados para seu diretório / wp-content / plugins /.
  4. Ative o plug-in através do menu 'Plugins' no WordPress.

Você também pode ir ao menu 'Plugins' no seu wordpress e clicar em "adicionar novo". Em seguida, localize este plug-in procurando por "Permalinks de tipo de postagem personalizada" e instale-o clicando no botão de instalação.

Um novo item aparecerá no menu à esquerda do seu administrador do wordpress. Aqui você pode alterar as configurações dependendo de suas necessidades (nomes das taxonomias, etc.).

Futhermore, meu site atualmente tem a seguinte estrutura de permalink "site.com/star/aristname/", que lista todas as postagens deste artista ou uma página / postagem sobre esse artista.

Se você está procurando por isso, pode criar uma página de arquivo para o seu tipo de postagem personalizado. O Wordpress assumirá automaticamente essa estrutura. Para mais informações sobre como criar sua própria página de arquivo, por favor, vá aqui . (Se você está realmente procurando por isso, eu posso explicar mais detalhadamente se você quiser)

    
por Aleks 28.06.2012 / 09:08
0

Whan eu queria ligar url à categoria (em qualquer estrutura de url) i definir uma lista de termos em estrutura de reescrita de url, mas no meu caso não havia muitos termos ...

os resultados foram algo como reescrever a chave de regra

publications/(annual-reports|articles|books|policy-briefs)/([^/]+).html?$ 

e valor da regra

index.php?post_type=publication&category_publication=$matches[1]&publication=$matches[2]&paged=1

tudo foi enganchado usando o filtro rewrite_rules_array .

resultado que você pode ver em enlace

    
por Butuzov 13.11.2012 / 22:09