Lidar com o nome da categoria reescrita antes dos diferentes slugs de tipo de post

4

Eu fui mais de cem tópicos semelhantes aqui que estavam perto do que eu preciso, mas infelizmente eu não consegui afinar isso, então peço desculpas se for uma duplicata.

Eu tenho vários tipos de postagem (como Events , Venues , Places ) e também uso Posts , onde os quatro tipos de postagem estão conectados ao padrão WordPress Categories taxonomy.

Estou tentando montar um permalink que se parece com isso:

enlace

Em que venues é o nome da categoria; 61312 é o post_id e california-venue é o nome do post.

Todos os tipos de postagem devem renderizar a mesma estrutura:

%category%/%post_id%/%postname%/

Essa estrutura de link permanente parece funcionar bem para Postagens em Configurações - > Permalinks, mas não para os outros tipos de postagens.

Aqueles com with_front => false retornam 404, os outros funcionam bem, mas redirecionam para post_type/postname .

Eu tenho uma regra de reescrita personalizada que se parece com isso:

array( 
  'regex'     => '^([^/]+)/([0-9]+)/([^/]+)?',  
  'query'       => 'category_name=$matches[1]&post_id=$matches[2]&pagename=$matches[3]', 
 )

Eu tentei filtrar o post_type_link e ver se o redirecionamento parava, e também tentei o snippet a seguir adicionando disable_redirect=1 às minhas regras de consulta:

add_filter('query_vars', 'my_public_query_vars');
function my_public_query_vars($qv)
{
    $qv[] = 'disable_redirect';
    return $qv;
}
add_filter('wp_redirect', 'my_disable_redirect');
function my_disable_redirect($location)
{
    $disable_redirect = get_query_var('disable_redirect');
    if(!empty($disable_redirect)) return false;
    return $location;
}

Isso simplesmente causou um WSOD.

Como posso evitar o redirecionamento para minhas visualizações únicas de cada tipo de postagem (a exibição de postagem única parece funcionar bem) e manter a estrutura de URL %category%/%post_id%/%postname% ?

    
por Mario Peshev 28.04.2015 / 23:24

1 resposta

1

Após alguns brainstorming e muitas tentativas e erros com o T5 Rewrite e o HM Rewrite, eu fui para a solução mais simples possível.

O permalink foi realmente interceptado pelo WordPress, então eu não precisei da regra de reescrita adicional (mesmo que não tenha doído, exceto performance). Deixei %category%/%post_id%/%postname% como permalink personalizado padrão e parece funcionar para todos os tipos de postagem até o momento.

O slug original é tratado com graça também (quando links restantes são encontrados), mas o novo é o padrão.

Eu joguei com template_redirect , request , redirect_canonical , query_vars , wp_redirect e outros ganchos para encontrar o problema e acabei com isso:

add_filter( 'request', 'sm_permalink_request_handler' );
function sm_permalink_request_handler( $request ) {
    if ( ! isset( $request['p'] ) ) {
        return $request;
    }

    // Get the post type, it's required to prevent the redirect
    $post_id = $request['p'];
    $post = get_post( $post_id );
    $request['post_type'] = $post->post_type;

    return $request;
} 


/**
 * Override get_permalink and prevent redirects
 */
function sm_fix_permalinks_for_post_types( $url, $post ) {
        $taxonomies = get_post_taxonomies();
        // See if categories are assigned to our CPT entry
        if ( ! empty( $taxonomies ) && in_array( 'category', $taxonomies ) ) {

            // Fetch all categories
            $categories = wp_get_post_categories( $post->ID, array() );

            if ( ! empty( $categories ) ) {
                // Get the main category in case there are more assigned
                // Somewhat arbitrary since it pops the last one.
                $main_category_id = array_pop( $categories );

                $main_category = get_category( $main_category_id );

                if( ! empty( $main_category ) ) {
                    $category_slug = $main_category->slug;
                    $post_id = $post->ID;
                    $post_name = $post->post_name;

                    $url = home_url( "$category_slug/$post_id/$post_name" );
                }
            }
        }

        return $url;
}

add_filter( 'post_type_link', 'sm_fix_permalinks_for_post_types', 10, 2 );

O primeiro problema foi relacionado à falta de post_type passada com a solicitação. Meu permalink estava filtrando por nome de categoria e ID de postagem, mas era agnóstico em relação ao post que interferia no WordPress. Ao buscar a postagem por seu ID e definir o post_type, as coisas voltaram ao normal.

O segundo problema estava relacionado aos permalinks para novas postagens, no admin e em qualquer lugar nos templates frontend. Outra parte de filtragem fez o truque e funciona em todo o site.

    
por Mario Peshev 02.05.2015 / 00:19