Tipos de publicaciones personalizadas, taxonomías y enlaces permanentes

62

Esto me está volviendo loco y estoy seguro de que es simple, pero nada de lo que busco tiene una estructura simple (todo es muy complejo).

Tengo un tipo de publicación personalizado product_listingy una taxonomía personalizada de product_cat(que es jerárquica y debería tener categorías similares).

Simplemente quiero que mis URL se vean así:

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

Pero para mi vida, no importa lo que haga, me sale el temido problema 404. Las páginas funcionan bien y las publicaciones funcionan bien, pero mis publicaciones personalizadas no funcionan correctamente. Se muestran como:

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

Que realmente funciona ! Es solo que quiero ver mi taxonomía personalizada allí y quiero poder acceder a la taxonomy.phpplantilla que configuré yendo a:

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

Ninguna de mis babosas es igual, ni quiero que lo sean. Aquí está el tipo de publicación y la parte de taxonomía de mi functions.phparchivo:

///// 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' ),
    ) );
}

También tengo otra taxonomía personalizada de la scentsque idealmente me gustaría tener algún tipo de URL amigable, pero estoy más abierto a esto. Tal vez me gustaría acceder a una lista de todos los olores yendo a, mysite.com/products/scentspero no tienen que ser específicos de la categoría.

Alguien puede ayudarme?

RodeoRamsey
fuente

Respuestas:

63

Cambie slugsus argumentos de tipo de publicación a products/%product_cat%, y slugen sus argumentos de taxonomía a solo products, luego vacíe sus reglas de reescritura. WordPress ahora debería manejar /products/my-product-cat/post-name/!

Ahora, finalmente, necesitamos ayudar un poco a WordPress con la generación de enlaces permanentes (fuera de la caja, no reconocerá la etiqueta 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 );

Una cosa a tener en cuenta, esto solo tomará la primera categoría de producto para la publicación ordenada por nombre . Si está asignando múltiples categorías a un solo producto, puedo cambiar fácilmente cómo determina cuál usar en el enlace permanente.

Déjame saber cómo te llevas con esto, ¡y podemos abordar los otros problemas!

TheDeadMedic
fuente
¡Oh, GUAU, estoy asombrado! Esto funcionó! ¡Finalmente! ¡Nunca pensé que algo lo haría! muchas gracias !!! ............ Ahora, ¿cómo generaría un enlace (algo así como el_permalink) para obtener la url de taxonomía por sí solo? / productos / my-product-cat /
RodeoRamsey
Creo que lo resolví ^^^ ............ pero ahora estoy atascado en Paginación. Parece que se rompe al usar cualquier paginación (función personalizada o incorporada) como / products / my-product-cat / se ve bien pero / products / my-product-cat / page / 2 / devuelve un 404 y suelta el archivo taxonomy.php en favor del archivo index.php. He intentado todo lo que pude encontrar y todavía nada.
RodeoRamsey
1
¿Consideraría cambiar las reescrituras de productos individuales a product/cat-name/product-name? (tenga en cuenta la singularidad) El problema es que la regla de reescritura para la paginación de taxonomía no se activa, ¡porque queda atrapada por una regla anterior para productos individuales!
TheDeadMedic
Estoy abierto a eso. Pero para entenderlo, ¿eso significaría que los productos tendrían una ruta URL diferente si está viendo una sola página de producto frente a una página de 'categoría'? ¿Entonces solo sería product / cat-name / prod-name pero cats sería products / cat-name / ? ¿No sería ese tipo de derrota el propósito de las URL "amigables para los humanos"? Me cuesta mucho ayudar a mis clientes a aprender el panel de control de wp, y mucho menos esa diferencia ... ¡Si estoy malentendido, por favor hágamelo saber! También podría estar contento con NO directorio frontal, como product-cat / product-nam y solo product-cat / . ¿Eso podría funcionar?
RodeoRamsey
2
Lo entendiste, aunque yo diría que es "amigable para los humanos", ya que existe una clara distinción entre archivos ( products/) y elementos singulares ( product/). Y no, mantendría el 'directorio frontal'; ayuda a mantener una distinción clara de publicaciones y páginas, además de lo contrario, podría terminar con problemas de rendimiento (es decir, reglas detalladas de reescritura).
TheDeadMedic
6

Gracias @TheDeadMechanic, tu respuesta me ayudó, pero solo parcialmente. Quería hacer lo mismo que @RodeoRamsey solicitó, pero con categorías anidadas (es decir:) mysite.com/products/category1/child-category-1/grandchild-category-1/product-namey su solución no funcionó para eso.

Finalmente se me ocurrió una solución extendida a mi pregunta que funciona, así que si alguien más necesita categorías / subcategorías anidadas, puede ver una solución detallada en mi propia pregunta. Espero que ayude a otros, y gracias por los pasos iniciales.

Jeff
fuente
4

No estoy seguro de que wp admita esa estructura de fábrica, pero puede crear fácilmente sus propias reglas de reescritura para hacerlo.

Echa un vistazo a una respuesta anterior aquí Autor url reescribir .

Puedes cambiar la linea

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

a algo como

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

la parte product_cat aquí puede ser superflua; no estoy seguro de si es necesaria.

Puede agregar las reglas que desee y tendrán prioridad sobre las incorporadas.

Chris
fuente
Bueno, no es tan interesante. Oh chico, creo que las reglas de reescritura personalizadas están más allá de mí. Intenté el código anterior (y el resto de la otra publicación) y nada cambió. Enjuagué todo y luego lo intenté nuevamente y aún no cambié, así que comenté todas las reglas de reescritura establecidas en los tipos de publicaciones y taxonomías personalizadas y enjuagué y TODAVÍA nada.
RodeoRamsey
2

Sí, me estaba volviendo loco antes de configurar el enlace permanente para el tipo de publicación personalizada. Encontré un complemento para manejar el tipo de publicación personalizada. Es muy fácil de usar. http://wordpress.org/extend/plugins/custom-post-permalinks/ ¡ WP debería agregar esto como una característica central! León


fuente
Lo había visto antes y me abstuve de usarlo porque decía taxonomías "no jerárquicas". Tenía una que estaba configurada como jerárquica, así que no pensé que funcionaría, pero hasta ahora, ¡parece haber funcionado! Además, parece estar trabajando para lograr la estructura / products / cat-name / prod-name / structure que estaba tratando de lograr (vea el comentario a otra respuesta). @TheDeadMedic, ¿es esta una opción viable? ¿O debería seguir con las reescrituras en el archivo functions.php?
RodeoRamsey
0

En realidad, es bastante fácil. Solo necesitas una línea. Aquí está mi código

función create_product_taxonomies ()
{
// Agregar nueva taxonomía, hacerla jerárquica (como categorías)
    $ etiquetas = matriz (
        'name' => _x ('Categorías', 'nombre general de taxonomía'),
        'singular_name' => _x ('Categoría', 'taxonomía nombre singular'),
        'search_items' => __ ('Categorías de búsqueda'),
        'all_items' => __ ('Todas las categorías'),
        'parent_item' => __ ('Categorías padre'),
        'parent_item_colon' => __ ('Categorías padre:'),
        'edit_item' => __ ('Editar categoría'),
        'update_item' => __ ('Actualizar categoría'),
        'add_new_item' => __ ('Agregar nueva categoría'),
        'new_item_name' => __ ('Nuevo nombre de categoría'),
        'menu_name' => __ ('Categoría'),
    );

    register_taxonomy ('product_cat', array ('product_listing'), array (
        'jerárquico' => verdadero,
        'labels' => $ etiquetas,
        'show_ui' => verdadero,
        'query_var' => verdadero,
        'rewrite' => array ('jerárquico' => verdadero),
    ));

Y se aplicó a la taxonomía generada para mis Comentarios CPT de GenerateWP.com. Estoy usando esto en mi propio sitio de WordPress, https://www.wpstarters.com

función reviews_category_taxonomy () {

    $ etiquetas = matriz (
        'name' => _x ('Categorías de comentarios', 'Nombre general de taxonomía', 'reviews_category'),
        'singular_name' => _x ('Categoría de comentarios', 'Nombre singular de taxonomía', 'reviews_category'),
        'menu_name' => __ ('Categoría de comentarios', 'reviews_category'),
        'all_items' => __ ('Todas las categorías de revisión', 'reviews_category'),
        'parent_item' => __ ('Categoría de revisión principal', 'reviews_category'),
        'parent_item_colon' => __ ('Categoría de revisión principal:', 'reviews_category'),
        'new_item_name' => __ ('Nuevo nombre de categoría de revisión', 'reviews_category'),
        'add_new_item' => __ ('Agregar nueva categoría de revisión', 'reviews_category'),
        'edit_item' => __ ('Editar categoría de revisión', 'reviews_category'),
        'update_item' => __ ('Actualizar categoría de revisión', 'reviews_category'),
        'view_item' => __ ('Ver categoría de revisión', 'reviews_category'),
        'separate_items_with_commas' => __ ('Separe los elementos con comas', 'reviews_category'),
        'add_or_remove_items' => __ ('Agregar o eliminar elementos', 'reviews_category'),
        'choose_from_most_used' => __ ('Elija entre los más utilizados', 'reviews_category'),
        'popular_items' => __ ('Categorías de revisión populares', 'reviews_category'),
        'search_items' => __ ('Buscar elementos', 'reviews_category'),
        'not_found' => __ ('No encontrado', 'reviews_category'),
        'no_terms' => __ ('Categorías sin revisión', 'reviews_category'),
        'items_list' => __ ('Revisar lista de categorías', 'reviews_category'),
        'items_list_navigation' => __ ('Navegación de lista de categorías de revisión', 'reviews_category'),
    );
    $ args = array (
        'labels' => $ etiquetas,
        'jerárquico' => verdadero,
        'public' => verdadero,
        'show_ui' => verdadero,
        'show_admin_column' => verdadero,
        'show_in_nav_menus' => verdadero,
        'show_tagcloud' => falso,
        'show_in_rest' => verdadero,
        'rewrite' => array ('jerárquico' => verdadero),
    );
    register_taxonomy ('reviews_category', array ('wps_reviews'), $ args);

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

Todo lo que necesitas, así que pon 'rewrite' => array ('jerárquico' => verdadero),

Leo Koo
fuente