Tipos de postagens, taxonomias e permalinks personalizados

60

Isso está me enlouquecendo e tenho certeza que é simples, mas nada que eu pesquise surge com uma estrutura simples (tudo é muito complexo).

Eu tenho um tipo de postagem personalizado product_listing e uma taxonomia personalizada de product_cat (que é hierárquica e deve ter categorias semelhantes).

Eu simplesmente quero que meus URLs tenham esta aparência:

mysite.com/products/category1/product-name1 
mysite.com/products/category2/product-name2

Mas para a vida de mim, não importa o que eu faça, estou recebendo o temido problema 404. As páginas funcionam bem e as Postagens funcionam bem, mas minhas postagens personalizadas não funcionam corretamente. Eles estão aparecendo como:

mysite.com/products/product-name1
mysite.com/products/product-name2

O que realmente funciona ! É só que eu quero ver a minha taxonomia personalizada lá, mais eu quero ser capaz de acessar o modelo taxonomy.php que eu configurei, indo para:

mysite.com/products/category1/
mysite.com/products/category2/

Nenhuma das minhas lesmas é a mesma, nem eu quero que elas sejam. Aqui está o tipo de postagem e a parte de taxonomia do meu arquivo functions.php :

///// CUSTOM POST TYPES /////

// register the new post type
register_post_type( 'product_listing', array( 
    'labels'                 => array(
        'name'               => __( 'Products' ),
        'singular_name'      => __( 'Product' ),
        'add_new'            => __( 'Add New' ),
        'add_new_item'       => __( 'Create New Product' ),
        'edit'               => __( 'Edit' ),
        'edit_item'          => __( 'Edit Product' ),
        'new_item'           => __( 'New Product' ),
        'view'               => __( 'View Products' ),
        'view_item'          => __( 'View Product' ),
        'search_items'       => __( 'Search Products' ),
        'not_found'          => __( 'No products found' ),
        'not_found_in_trash' => __( 'No products found in trash' ),
        'parent'             => __( 'Parent Product' ),
    ),
    'description'           => __( 'This is where you can create new products on your site.' ),
    'public'                => true,
    'show_ui'               => true,
    'capability_type'       => 'post',
    'publicly_queryable'    => true,
    'exclude_from_search'   => false,
    'menu_position'         => 2,
    'menu_icon'             => get_stylesheet_directory_uri() . '/images/tag_orange.png',
    'hierarchical'          => true,
    '_builtin'              => false, // It's a custom post type, not built in!
    'rewrite'               => array( 'slug' => 'products', 'with_front' => true ),
    'query_var'             => true,
    'supports'              => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions' ),
) );


//hook into the init action and call create_book_taxonomies when it fires
add_action( 'init', 'create_product_taxonomies', 0 );
//add_action('admin_init', 'flush_rewrite_rules');

//create two taxonomies, genres and writers for the post type "book"
function create_product_taxonomies() {
    // Add new taxonomy, make it hierarchical (like categories)
    $labels = array(
        'name'              => _x( 'Categories', 'taxonomy general name' ),
        'singular_name'     => _x( 'Category', 'taxonomy singular name' ),
        'search_items'      =>  __( 'Search Categories' ),
        'all_items'         => __( 'All Categories' ),
        'parent_item'       => __( 'Parent Categories' ),
        'parent_item_colon' => __( 'Parent Categories:' ),
        'edit_item'         => __( 'Edit Category' ), 
        'update_item'       => __( 'Update Category' ),
        'add_new_item'      => __( 'Add New Category' ),
        'new_item_name'     => __( 'New Category Name' ),
        'menu_name'         => __( 'Category' ),
    );  

    register_taxonomy( 'product_cat', array( 'product_listing' ), array(
        'hierarchical'  => true,
        'labels'        => $labels,
        'show_ui'       => true,
        'query_var'     => true,
        //'rewrite'     => true,
        'rewrite'       => array( 'slug' => '%category%', 'with_front' => true ),
    ) );

    // Add new taxonomy, NOT hierarchical (like tags)
    $labels = array(
        'name'                       => _x( 'Scents', 'taxonomy general name' ),
        'singular_name'              => _x( 'Scent', 'taxonomy singular name' ),
        'search_items'               =>  __( 'Search Scents' ),
        'popular_items'              => __( 'Popular Scents' ),
        'all_items'                  => __( 'All Scents' ),
        'parent_item'                => null,
        'parent_item_colon'          => null,
        'edit_item'                  => __( 'Edit Scent' ), 
        'update_item'                => __( 'Update Scent' ),
        'add_new_item'               => __( 'Add New Scent' ),
        'new_item_name'              => __( 'New Scent Name' ),
        'separate_items_with_commas' => __( 'Separate scents with commas' ),
        'add_or_remove_items'        => __( 'Add or remove scents' ),
        'choose_from_most_used'      => __( 'Choose from the most used scents' ),
        'menu_name'                  => __( 'Scents' ),
    ); 

    register_taxonomy( 'scent', 'product_listing', array(
        'hierarchical'  => false,
        'labels'        => $labels,
        'show_ui'       => true,
        'query_var'     => true,
        //'rewrite'     => array( 'slug' => 'scents' ),
    ) );
}

Eu também tenho outra taxonomia personalizada de scents que eu gostaria de ter algum tipo de URL amigável, mas estou mais aberto a isso. Gostaria de talvez acessar uma lista de todos os aromas acessando mysite.com/products/scents , mas eles não precisam ser específicos de categoria.

Alguém pode me ajudar?

    
por RodeoRamsey 14.12.2010 / 00:56
fonte

5 respostas

62

Altere slug em seus argumentos de tipo de postagem para products/%product_cat% e slug em seus argumentos de taxonomia para apenas products e, em seguida, libere suas regras de regravação. O WordPress deve agora lidar com /products/my-product-cat/post-name/ !

Agora, finalmente, precisamos ajudar o WordPress um pouco com a geração de permalinks (fora da caixa, ele não reconhecerá a tag de permastruto %product_cat% ):

/**
 * Inject term slug into custom post type permastruct.
 * 
 * @link   http://wordpress.stackexchange.com/a/5313/1685
 * 
 * @param  string  $link
 * @param  WP_Post $post 
 * @return array
 */
function wpse_5308_post_type_link( $link, $post ) {
    if ( $post->post_type === 'product_listing' ) {
        if ( $terms = get_the_terms( $post->ID, 'product_cat' ) )
            $link = str_replace( '%product_cat%', current( $terms )->slug, $link );
    }

    return $link;
}

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

Uma coisa a notar é que você pegará a primeira categoria de produto para a postagem ordenada pelo nome . Se você está atribuindo várias categorias a um único produto, posso alterar facilmente como ele determina qual delas usar no permalink.

Deixe-me saber como você se sai com isso e podemos resolver os outros problemas!

    
por TheDeadMedic 14.12.2010 / 02:50
fonte
6

Obrigado @TheDeadMechanic, sua resposta me ajudou, mas apenas parcialmente. Eu queria fazer a mesma coisa que o @RodeoRamsey pediu, mas com categorias aninhadas (ex .: mysite.com/products/category1/child-category-1/grandchild-category-1/product-name ) e sua solução não funcionou para isso.

Eu finalmente encontrei uma solução estendida para a minha pergunta que funciona, então se alguém mais precisar de categorias / subcategorias aninhadas, você pode ver um solução detalhada na minha própria pergunta. Espero que ajude os outros e obrigado pelas etapas iniciais.

    
por Jeff 23.01.2012 / 19:39
fonte
4

Não tenho certeza se o wp é compatível com essa estrutura, mas você pode facilmente criar suas próprias regras de reescrita para fazê-lo.

Confira uma resposta anterior aqui Autor URL reescrita .

Você pode mudar a linha

$newrules['author/([^/]+)/songs/?$'] = 'index.php?post_type=songs&author=$matches[1]';

para algo como

$newrules['products/([^/]+)/([^/]+)/?$'] = 'index.php?post_type=product_listing&product_cat=$matches[1]&name=$matches[2]';

a parte product_cat aqui pode ser supérflua - não tenho certeza se é necessário.

Você pode adicionar as regras que quiser e elas terão prioridade sobre as que estão inseridas.

    
por Chris 14.12.2010 / 01:07
fonte
2

Sim, estava me enlouquecendo antes de configurar o permalink para o tipo de postagem personalizado. Eu encontrei um plugin para lidar com o tipo de postagem personalizado. É muito fácil de usar. enlace WP deve adicionar isso como um recurso principal! Leo

    
por user1975 14.12.2010 / 11:13
fonte
0

Na verdade, é bem fácil. Você só precisa de uma linha. Aqui está meu código

function create_product_taxonomies()
{
// Add new taxonomy, make it hierarchical (like categories)
    $labels = array(
        'name' => _x('Categories', 'taxonomy general name'),
        'singular_name' => _x('Category', 'taxonomy singular name'),
        'search_items' => __('Search Categories'),
        'all_items' => __('All Categories'),
        'parent_item' => __('Parent Categories'),
        'parent_item_colon' => __('Parent Categories:'),
        'edit_item' => __('Edit Category'),
        'update_item' => __('Update Category'),
        'add_new_item' => __('Add New Category'),
        'new_item_name' => __('New Category Name'),
        'menu_name' => __('Category'),
    );

    register_taxonomy('product_cat', array('product_listing'), array(
        'hierarchical' => true,
        'labels' => $labels,
        'show_ui' => true,
        'query_var' => true,
        'rewrite' => array('hierarchical' => true),
    ));

E aplicado à taxonomia gerada para o meu CPT de comentários do GenerateWP.com. Estou usando isso no meu próprio site WordPress, enlace

function reviews_category_taxonomy() {

    $labels = array(
        'name'                       => _x( 'Reviews Categories', 'Taxonomy General Name', 'reviews_category' ),
        'singular_name'              => _x( 'Reviews Category', 'Taxonomy Singular Name', 'reviews_category' ),
        'menu_name'                  => __( 'Reviews Category', 'reviews_category' ),
        'all_items'                  => __( 'All Review Categories', 'reviews_category' ),
        'parent_item'                => __( 'Parent Review Category', 'reviews_category' ),
        'parent_item_colon'          => __( 'Parent Review Category:', 'reviews_category' ),
        'new_item_name'              => __( 'New Review Category Name', 'reviews_category' ),
        'add_new_item'               => __( 'Add New Review Category', 'reviews_category' ),
        'edit_item'                  => __( 'Edit Review Category', 'reviews_category' ),
        'update_item'                => __( 'Update Review Category', 'reviews_category' ),
        'view_item'                  => __( 'View Review Category', 'reviews_category' ),
        'separate_items_with_commas' => __( 'Separate items with commas', 'reviews_category' ),
        'add_or_remove_items'        => __( 'Add or remove items', 'reviews_category' ),
        'choose_from_most_used'      => __( 'Choose from the most used', 'reviews_category' ),
        'popular_items'              => __( 'Popular Review Categories', 'reviews_category' ),
        'search_items'               => __( 'Search Items', 'reviews_category' ),
        'not_found'                  => __( 'Not Found', 'reviews_category' ),
        'no_terms'                   => __( 'No Review Categories', 'reviews_category' ),
        'items_list'                 => __( 'Review Categories list', 'reviews_category' ),
        'items_list_navigation'      => __( 'Review Categories list navigation', 'reviews_category' ),
    );
    $args = array(
        'labels'                     => $labels,
        'hierarchical'               => true,
        'public'                     => true,
        'show_ui'                    => true,
        'show_admin_column'          => true,
        'show_in_nav_menus'          => true,
        'show_tagcloud'              => false,
        'show_in_rest'               => true,
        'rewrite' => array( 'hierarchical' => true ),
    );
    register_taxonomy( 'reviews_category', array( 'wps_reviews' ), $args );

}
add_action( 'init', 'reviews_category_taxonomy', 0 );

Tudo o que você precisa, por isso, coloque o 'reescrever' = > array ('hierárquico' = > true),

    
por Leo Koo 06.12.2017 / 20:15
fonte