Múltiplos tipos de posts - compartilha o mesmo ReWrite slug?

4

Eu me deparei com outro maravilhoso problema 404. Eu estou tentando ter 2 tipos de post separados que compartilham a mesma lesma de reescrita. Eu corri minhas regras de reescrita, e quando eu testei apenas 1 do CPT funciona - o outro recebe um 404. Minha reescrita que eu gostaria de usar para ambos é:

'rewrite' => array('slug' => 'team/%teamtype%'),

Alguém sabe como lidar com isso?

add_action( 'init', 'create_rider_type' );

function create_rider_type() {

register_post_type('riders', 
array(  
    'description' => 'rider custom post type',
    'show_ui' => true,
    'menu_position' => 5,
    'menu_icon' => get_stylesheet_directory_uri() . '/images/riders.png',
    'exclude_from_search' => false,
    'labels' => array(
        'name' => 'Team Riders',
        'singular_name' => 'Rider',
        'add_new' => 'Add New rider',
        'add_new_item' => 'Add New rider',
        'edit' => 'Edit riders',
        'edit_item' => 'Edit rider',
        'new_item' => 'New rider',
        'view' => 'View rider',
        'view_item' => 'View rider',
        'search_items' => 'Search riders',
        'not_found' => 'No riders found',
        'not_found_in_trash' => 'No riders found in Trash',
        'parent' => 'Parent rider',
    ),
    'hierarchical' => false,
    'supports' => array('title','editor','excerpt', 'trackbacks','custom-fields', 'comments','revisions','thumbnail','author','page-attributes'),
    'public' => true,
    'rewrite' => array('slug' => 'team/%teamtype%'),
    'taxonomies' => array('teamtype')
    ) 
);


}





add_action( 'init', 'create_sponsor_type' );

function create_sponsor_type() {

register_post_type('sponsors', 
array(  
    'description' => 'sponsor custom post type',
    'show_ui' => true,
    'menu_position' => 5,
    'menu_icon' => get_stylesheet_directory_uri() . '/images/sponsors.png',
    'exclude_from_search' => false,
    'labels' => array(
        'name' => 'Team sponsors',
        'singular_name' => 'sponsor',
        'add_new' => 'Add New sponsor',
        'add_new_item' => 'Add New sponsor',
        'edit' => 'Edit sponsors',
        'edit_item' => 'Edit sponsor',
        'new_item' => 'New sponsor',
        'view' => 'View sponsor',
        'view_item' => 'View sponsor',
        'search_items' => 'Search sponsors',
        'not_found' => 'No sponsors found',
        'not_found_in_trash' => 'No sponsors found in Trash',
        'parent' => 'Parent sponsor',
    ),
    'hierarchical' => false,
    'supports' => array('title','editor','excerpt', 'trackbacks','custom-fields', 'comments','revisions','thumbnail','author','page-attributes'),
    'public' => true,
    'rewrite' => array('slug' => 'team/%teamtype%'),
    'taxonomies' => array('teamtype')
    ) 
);

}

** * ** * ** * *** * Atualizar * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * ** * *

O código de reescrita do CPT original que publiquei foi simplificado para que eu pudesse ir direto ao ponto, mas talvez faça mais sentido se você puder ver como estou lidando com esses permalinks com minha taxonomia personalizada. Eu atualizei o código para mostrar.

Eu realmente gostaria de mantê-los em separado como tipos de organização, bem como metabólitos separados para cada um. Por favor, verifique as reescritas atualizadas para os CPT's, bem como a minha configuração de taxonomia abaixo:

add_action( 'init', 'create_team_taxonomies' );

function create_team_taxonomies() {
register_taxonomy( 
'teamtype', 
array('riders','sponsors'),
array( 
    'labels' => array(
        'name' => 'Team Types',
        'singular_name' => 'Team Type',
        'search_items' =>  'Search Team Types',
        'popular_items' => 'Popular Team Types',
        'all_items' => 'All Team Types',
        'parent_item' => 'Parent Team Type',
        'parent_item_colon' => 'Parent Team Type:',
        'edit_item' => 'Edit Team Type', 
        'update_item' => 'Update Team Type',
        'add_new_item' => 'Add New Team Type',
        'new_item_name' => 'New Team Type Name'
    ), 
'hierarchical' => true, 
'public' => true,
'show_ui' => true,
'query_var' => 'teamtype',
'show_tagcloud' => true,
'rewrite' => array( 'slug' => 'team', 'with_front' => false) 
) 
);

}

E aqui está como eu configuro a reescrita quando seleciono a Taxonomia e publico a postagem:

add_filter('post_link', 'teamtypepermalink', 10, 3);
add_filter('post_type_link', 'teamtypepermalink', 10, 3);

function teamtypepermalink($permalink, $post_id, $leavename) {
if (strpos($permalink, '%teamtype%') === FALSE) return $permalink;

    // Get post
    $post = get_post($post_id);
    if (!$post) return $permalink;

    // Get taxonomy terms
    $terms = wp_get_object_terms($post->ID, 'teamtype');    
    if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0])) $taxonomy_slug = $terms[0]->slug;
    else $taxonomy_slug = 'not-specified';

return str_replace('%teamtype%', $taxonomy_slug, $permalink);
}
    
por Joe 19.05.2011 / 04:40

4 respostas

1

Tanto quanto eu sei, você não pode fazer isso. Cada slug é convertido em um item query_vars que consulta um tipo de objeto específico (taxonomia ou tipo de postagem). Se você analisar sua WP_Query, verá que está consultando o primeiro tipo de postagem.

Talvez um WP Ninja aqui possa nos iluminar com isso, mas tenho quase certeza de que você não pode fazer isso. Ou pelo menos você não deveria.

    
por MZAweb 19.05.2011 / 07:12
1

Como são construídos CPTs (e posts / páginas), isso não é possível. O slug é reservado para o tipo específico, com a compreensão / suposição de que 2 CPTs = 2 tipos diferentes de conteúdo.

com base no seu código, quase parece que cada um dos itens que você tem no CPT seria melhor ser servido como uma taxonomia personalizada, com ambos sendo anexados a um único CPT (eu estou supondo algum tipo de evento?)

    
por Norcross 19.05.2011 / 08:48
1

Acabei de fazer um projeto em que dois tipos de postagem personalizada precisavam compartilhar o mesmo slug. O truque é sobrescrever a consulta vars por meio do request filter . Vamos chamar os tipos de post 'foo' e 'bar', e eles vão compartilhar slug 'foo'.

O código a seguir é bruto e da memória, por exemplo, apenas. Sal a gosto, não copie e cole:

add_filter('request', 'overwriteQueryVars', 10, 1);

function overwriteQueryVars($query)
{
    if ( empty($query['post_type']) || $query['post_type']!='foo' ) {
        return $query;
    }

    // Run an SQL query that looks like this, against both post types
    $sql = "SELECT ID FROM wp_posts WHERE post_type='foo' and post_name='%s'";
    $post_name = urlencode($query['name']);

    // If you've found that the row exists for post_type 'bar' but not 'foo',
    // then simply return the $query array unaltered
    if ( in_foo_but_not_bar ) {
        return $query;
    }

    // If you've found that the row exists for post_type 'bar' but not 'foo',
    // then rewrite the $query array:

    // Original:
    $query = array (
        'page' => '',
        'foo' => 'some-nice-post',
        'post_type' => 'foo',
        'name' => 'some-nice-post',
    );

    // Make it look like this:
    $query = array (
        'page' => '',
        'bar' => 'some-nice-post',
        'post_type' => 'bar',
        'name' => 'some-nice-post',
    );

}
    
por dotancohen 09.05.2018 / 14:55
0

Suas regras de reescrever substituirão umas às outras, e o WordPress consultará apenas um dos tipos de postagem. Eu acho que é o mais recente que está registrado que "ganha", então /testslug/bmw/ sempre irá consultar uma postagem com slug bmw e postar tipo sponsors . Se você for para /testslug/some-name/ e some-name for um piloto, ele ainda consultará o tipo de postagem sponsors e postará slug some-name . Ele não encontrará nenhum post e, portanto, fornecerá um erro 404. Isso acontece na consulta "padrão" que o WordPress fará por você, antes de carregar a página de modelo, para que você não possa resolver isso no arquivo de modelo single-sponsors.php exemplo (você poderia em 404.php , mas fica feio).

A solução mais limpa é substituir parte da lógica que faz essa análise de URL e fazer com que ela aceite uma URL "ambígua". Teste se é um piloto ou um patrocinador e altere os parâmetros para que o WordPress continue com um piloto ou um patrocinador. Mike uma vez forneceu uma maneira de fazer isso com páginas e taxonomias, deve ser possível estender isso para trabalhar somente com postagens.

    
por Jan Fabry 19.05.2011 / 10:59