Tipos de postagem personalizados, taxonomias e links permanentes

62

Isso está me deixando maluco e tenho certeza de que é simples, mas nada que eu busque cria uma estrutura simples (tudo é muito complexo).

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

Eu simplesmente quero que meus URLs sejam assim:

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

Mas para a minha vida, 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 minha taxonomia personalizada lá, além de poder acessar o taxonomy.phpmodelo que eu configurei acessando:

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

Nenhuma das minhas lesmas são iguais, nem quero que sejam. Aqui está o tipo de post e a parte taxonômica do meu functions.phparquivo:

///// 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 scentsque, idealmente, gostaria de ter algum tipo de URL amigável, mas sou mais aberto a isso. Talvez eu mysite.com/products/scentsqueira acessar uma lista de todos os aromas acessando, mas eles não precisam ser específicos de uma categoria.

Alguém pode me ajudar?

RodeoRamsey
fonte

Respostas:

63

Altere slugseus argumentos de tipo de postagem para products/%product_cat%e, slugem seus argumentos de taxonomia products, apenas , em seguida, limpe suas regras de reescrita. Agora o WordPress deve lidar /products/my-product-cat/post-name/!

Agora, finalmente, precisamos ajudar um pouco o WordPress a gerar links permanentes (fora da caixa, ele não reconhecerá a tag permastruct %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 ser observada: isso apenas captura a primeira categoria de produto da postagem ordenada por nome . Se você estiver atribuindo várias categorias a um único produto, posso alterar facilmente como ele determina qual delas usar no link permanente.

Deixe-me saber como lidar com isso, e podemos resolver os outros problemas!

TheDeadMedic
fonte
Oh WOW, estou admirado! Isso funcionou! Finalmente! Eu nunca pensei que algo iria !!! muito obrigada SOOOOOO !!! ............ Agora, como eu geraria um link (algo como the_permalink) para pegar o URL da taxonomia por conta própria? / products / my-product-cat /
RodeoRamsey
Acho que resolvi isso ^^^ ............ mas agora estou preso no Pagination. Parece quebrar ao usar qualquer paginação (função personalizada ou embutida) como / products / my-product-cat / parece bom, mas / products / my-product-cat / page / 2 / retorna um 404 e solta o arquivo taxonomy.php em favor do arquivo index.php. Eu tentei de tudo que pude encontrar e ainda nada.
RodeoRamsey
11
Você consideraria alterar as reescritas de produto único para product/cat-name/product-name? (observe a singularidade) O problema é que a regra de reescrita para a paginação da taxonomia não é acionada, porque está sendo pega por uma regra anterior para produtos únicos!
TheDeadMedic
Estou aberto a isso. Mas, pensando bem, isso significaria que os produtos teriam um caminho de URL diferente se você estivesse visualizando uma única página de produto versus uma página de 'categoria'? Tão único seria produto / nome do gato / nome do produto, mas gatos seriam produtos / nome do gato / ? Esse tipo de derrota não seria o objetivo de URLs "amigáveis ​​ao ser humano"? Eu tenho dificuldade em ajudar meus clientes a aprender o painel wp e muito menos essa diferença ... Se eu estiver entendendo mal pls, avise-me! Eu também posso estar feliz com o NO front directory, como product-cat / product-nam e apenas product-cat / . Isso poderia funcionar?
RodeoRamsey
2
Você entendeu - embora eu diria que é "amigável ao ser humano", pois há uma clara distinção entre arquivos ( products/) e itens singulares ( product/). E não, eu manteria o 'diretório frontal' - ele ajuda a manter uma distinção clara de postagens e páginas, além disso, você pode acabar com problemas de desempenho (por exemplo, regras detalhadas de reescrita).
TheDeadMedic
6

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

Finalmente, eu vim com uma solução estendida para minha pergunta que funciona, portanto, se alguém mais precisar de categorias / subcategorias aninhadas, poderá ver uma solução detalhada em minha própria pergunta. Espero que ajude os outros e obrigado pelas etapas iniciais.

Jeff
fonte
4

Não tenho certeza se o wp suporta essa estrutura imediatamente - mas você pode facilmente criar suas próprias regras de reescrita para fazer isso.

Confira uma resposta anterior aqui URL do autor 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 desejar e elas terão prioridade sobre as que estão embutidas.

Chris
fonte
Bem, isso não é interessante. Oh garoto, acho que as regras de reescrita personalizadas estão além de mim. Eu tentei o código acima (e o resto do outro post) e nada mudou. Limpei tudo e tentei novamente e, ainda assim, nenhuma alteração, por isso comentei todas as regras de reescrita definidas nos tipos e taxonomias de postagens personalizadas, limpei e AINDA nada.
RodeoRamsey
2

Sim, estava me deixando louco antes de definir o link permanente para o tipo de postagem personalizada. Encontrei um plugin para lidar com o tipo de postagem personalizada. É muito fácil de usar. http://wordpress.org/extend/plugins/custom-post-permalinks/ O WP deve adicionar isso como um recurso principal! Leo


fonte
Eu já tinha visto esse antes e evitei usá-lo porque dizia taxonomias "para não hierárquicas". Eu tinha um que estava definido como hierárquico, então não achei que funcionaria, mas até agora parece ter funcionado! Além disso, parece estar trabalhando para realizar a estrutura / products / cat-name / prod-name / que eu estava tentando obter (consulte o comentário para outra resposta). @TheDeadMedic, essa é uma opção viável? Ou devo ficar com as reescritas no arquivo functions.php?
RodeoRamsey
0

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

função create_product_taxonomies ()
{
// Adicione nova taxonomia, torne-a hierárquica (como categorias)
    $ labels = array (
        'name' => _x ('Categorias', 'nome geral da taxonomia'),
        'singular_name' => _x ('Categoria', 'nome singular da taxonomia'),
        'search_items' => __ ('Categorias de pesquisa'),
        'all_items' => __ ('Todas as categorias'),
        'parent_item' => __ ('Categorias dos pais'),
        'parent_item_colon' => __ ('Categorias dos pais:'),
        'edit_item' => __ ('Editar categoria'),
        'update_item' => __ ('Atualizar categoria'),
        'add_new_item' => __ ('Adicionar nova categoria'),
        'new_item_name' => __ ('Novo nome da categoria'),
        'menu_name' => __ ('Categoria'),
    );

    register_taxonomy ('product_cat', array ('product_listing'), array (
        'hierárquico' => verdadeiro,
        'labels' => $ labels,
        'show_ui' => verdadeiro,
        'query_var' => true,
        'reescrever' => matriz ('hierárquico' => verdadeiro),
    ));

E aplicado à taxonomia gerada para minhas avaliações CPT de GenerateWP.com. Estou usando isso no meu próprio site WordPress, https://www.wpstarters.com

função reviews_category_taxonomy () {

    $ labels = array (
        'name' => _x ('Categorias de comentários', 'Nome geral da taxonomia', 'comentários_categoria'),
        'singular_name' => _x ('Categoria de resenhas', 'Nome singular da taxonomia', 'categoria de resenhas'),
        'menu_name' => __ ('Categoria de comentários', 'categoria de comentários'),
        'all_items' => __ ('Todas as categorias de revisão', 'reviews_category'),
        'parent_item' => __ ('Categoria de revisão dos pais', 'reviews_category'),
        'parent_item_colon' => __ ('Categoria de revisão dos pais:', 'reviews_category'),
        'new_item_name' => __ ('Novo nome da categoria de revisão', 'reviews_category'),
        'add_new_item' => __ ('Adicionar nova categoria de revisão', 'reviews_category'),
        'edit_item' => __ ('Editar categoria de revisão', 'reviews_category'),
        'update_item' => __ ('Atualizar categoria de revisão', 'reviews_category'),
        'view_item' => __ ('Visualizar categoria de revisão', 'reviews_category'),
        'separado_itens_com_commas' => __ ('Separe itens com vírgulas', 'revisões_categoria'),
        'add_or_remove_items' => __ ('Adicionar ou remover itens', 'reviews_category'),
        'choose_from_most_used' => __ ('Escolha entre as mais usadas', 'reviews_category'),
        'popular_items' => __ ('Categorias de críticas populares', 'reviews_category'),
        'search_items' => __ ('Itens de pesquisa', 'reviews_category'),
        'not_found' => __ ('Não encontrado', 'reviews_category'),
        'no_terms' => __ ('Sem categorias de comentários', 'reviews_category'),
        'items_list' => __ ('Lista de categorias de comentários', 'categoria de comentários'),
        'items_list_navigation' => __ ('Revisão da lista de categorias de navegação', 'reviews_category'),
    );
    $ args = matriz (
        'labels' => $ labels,
        'hierárquico' => verdadeiro,
        'public' => true,
        'show_ui' => verdadeiro,
        'show_admin_column' => true,
        'show_in_nav_menus' => verdadeiro,
        'show_tagcloud' => false,
        'show_in_rest' => verdadeiro,
        'reescrever' => matriz ('hierárquico' => verdadeiro),
    );
    register_taxonomy ('reviews_category', array ('wps_reviews'), $ args);

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

Tudo o que você precisa é colocar a matriz 'reescrever' => ('hierárquica' => true),

Leo Koo
fonte