Taxonomía personalizada específica para un tipo de publicación personalizada

29

Quiero crear una taxonomía personalizada que se comporte de manera similar al tipo de publicación, ya que una categoría se comporta con las publicaciones predeterminadas (en función de /% category% /% postname% / estructura de enlace permanente) para que las publicaciones en los tipos de publicaciones personalizadas sean se muestra como www.example.com/custom-post-type/custom-taxonomy-name/post-name También quiero que el cuadro meta de categoría aparezca solo cuando agreguemos una nueva publicación predeterminada y no cuando agreguemos una nueva publicación en la costumbre el tipo de publicación y el cuadro de taxonomía personalizada aparecerán solo cuando agreguemos una nueva publicación en el tipo de publicación personalizada y no cuando agreguemos una nueva publicación predeterminada.

Saurabh Goel
fuente

Respuestas:

46

En primer lugar, si desea mostrar metabox de taxonomía solo al tipo de publicación personalizada, luego registre la taxonomía solo a ese tipo de publicación personalizada pasando el nombre del tipo de publicación personalizada como argumento en register_taxonomy. Al hacer esto, la metabox de taxonomía aparece solo para el tipo de publicación personalizada. Si no desea mostrar el metabox de categoría al tipo de publicación personalizada, elimine el término categoría como argumento al registrar el tipo de publicación personalizada y, en su lugar, incluya el nombre de la ficha de taxonomía como este 'taxonomies' => array ('post_tag', 'your_taxonomy_name') . Aquí está el código de cómo lo logré. He registrado una taxonomía personalizada con slug themes_categories debajo de temas de tipo de publicación personalizada


function themes_taxonomy() {  
    register_taxonomy(  
        'themes_categories',  //The name of the taxonomy. Name should be in slug form (must not contain capital letters or spaces). 
        'themes',        //post type name
        array(  
            'hierarchical' => true,  
            'label' => 'Themes store',  //Display name
            'query_var' => true,
            'rewrite' => array(
                'slug' => 'themes', // This controls the base slug that will display before each term
                'with_front' => false // Don't display the category base before 
            )
        )  
    );  
}  
add_action( 'init', 'themes_taxonomy');

Luego, para cambiar el enlace permanente, he creado la siguiente función


function filter_post_type_link($link, $post)
{
    if ($post->post_type != 'themes')
        return $link;

    if ($cats = get_the_terms($post->ID, 'themes_categories'))
        $link = str_replace('%themes_categories%', array_pop($cats)->slug, $link);
    return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);

Luego registré un tipo de publicación personalizada con temas de slug como se muestra a continuación


//Registering Custom Post Type Themes
add_action( 'init', 'register_themepost', 20 );
function register_themepost() {
    $labels = array(
        'name' => _x( 'Themes', 'my_custom_post','custom' ),
        'singular_name' => _x( 'Theme', 'my_custom_post', 'custom' ),
        'add_new' => _x( 'Add New', 'my_custom_post', 'custom' ),
        'add_new_item' => _x( 'Add New ThemePost', 'my_custom_post', 'custom' ),
        'edit_item' => _x( 'Edit ThemePost', 'my_custom_post', 'custom' ),
        'new_item' => _x( 'New ThemePost', 'my_custom_post', 'custom' ),
        'view_item' => _x( 'View ThemePost', 'my_custom_post', 'custom' ),
        'search_items' => _x( 'Search ThemePosts', 'my_custom_post', 'custom' ),
        'not_found' => _x( 'No ThemePosts found', 'my_custom_post', 'custom' ),
        'not_found_in_trash' => _x( 'No ThemePosts found in Trash', 'my_custom_post', 'custom' ),
        'parent_item_colon' => _x( 'Parent ThemePost:', 'my_custom_post', 'custom' ),
        'menu_name' => _x( 'Themes Posts', 'my_custom_post', 'custom' ),
    );

    $args = array(
        'labels' => $labels,
        'hierarchical' => false,
        'description' => 'Custom Theme Posts',
        'supports' => array( 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'comments', 'revisions', 'post-formats', 'custom-fields' ),
        'taxonomies' => array( 'post_tag','themes_categories'),
        'show_ui' => true,
        'show_in_menu' => true,
        'menu_position' => 5,
        'menu_icon' => get_stylesheet_directory_uri() . '/functions/panel/images/catchinternet-small.png',
        'show_in_nav_menus' => true,
        'publicly_queryable' => true,
        'exclude_from_search' => false,
        'query_var' => true,
        'can_export' => true,
        'rewrite' => array('slug' => 'themes/%themes_categories%','with_front' => FALSE),
        'public' => true,
        'has_archive' => 'themes',
        'capability_type' => 'post'
    );  
    register_post_type( 'themes', $args );//max 20 charachter cannot contain capital letters and spaces
}  

Hay algunas cosas que debe recordar al registrar una publicación personalizada. cambie el parámetro has_archive a nombre de mensaje personalizado de tipo de publicación y otro es cambiar el nombre de mensaje de reescritura como 'slug' => 'custom_post_type_slug /% taxonomy_slug%

Ahora, cuando agregue un nuevo tipo de publicación en la página de escritura de tipo de publicación ... verá el enlace permanente como http://www.example.com/wordpress/themes/%themes_categories%/post-name/ . Si no se selecciona la taxonomía personalizada para esta publicación, el enlace permanente seguirá siendo http://www.example.com/wordpress/themes/%themes_categories%/post-name/, que luego mostrará una solicitud incorrecta. Para corregir esto, creamos un término predeterminado en la taxonomía personalizada. (igual que sin categorizar en categorías) Agregue esto a functions.php

function default_taxonomy_term( $post_id, $post ) {
    if ( 'publish' === $post->post_status ) {
        $defaults = array(
            'themes_categories' => array( 'other'),   //

            );
        $taxonomies = get_object_taxonomies( $post->post_type );
        foreach ( (array) $taxonomies as $taxonomy ) {
            $terms = wp_get_post_terms( $post_id, $taxonomy );
            if ( empty( $terms ) && array_key_exists( $taxonomy, $defaults ) ) {
                wp_set_object_terms( $post_id, $defaults[$taxonomy], $taxonomy );
            }
        }
    }
}
add_action( 'save_post', 'default_taxonomy_term', 100, 2 );

Ahora, cuando la taxonomía personalizada se deja en blanco, el enlace permanente se convierte en http://www.example.com/wordpress/themes/other/post-name/ automáticamente.

Por último, no olvide borrar la reescritura haciendo clic en Guardar cambios en la configuración de enlace permanente en la sección de administración; de lo contrario, será redirigido al error 404. Espero que esto te ayude.

Rabin shrestha
fuente
Oye, tuve un problema ... cuando sacamos el enlace al archivo de taxonomía utilizando echo get_the_term_list ($ post-> ID, $ taxonomy, '', ',', ''); entonces el enlace aparece como www.example.com/taxonomy-term y no www.example.com/themes/taxonomy-term. Creo que necesitamos escribir una regla HTACESS para ello.
Saurabh Goel
+1, gran explicación, seguido paso a paso y funciona, probado en WordPress 3.4.2
Alex Vang
1
Me preguntaba: ¿tiene que agregar una taxonomía personalizada al conjunto de taxonomías al registrar un tipo de publicación personalizado? Porque parece estar funcionando sin agregarlo allí también (si ya registra una taxonomía en el tipo de publicación personalizada). Sólo curioso.
trainoasis
Intenté esto con el complemento de la interfaz de usuario de CPT mientras seguía usando su reescritura para cambiar la URL. Todo se ve bien. todas las URL son correctas y restablezco los enlaces permanentes, pero las publicaciones reales arrojan un 404. :( EDITAR: no importa. Revisé y eliminé Hierarchical de la taxonomía y también me aseguré de guardar las cosas en el orden correcto, y ahora las publicaciones parece funcionar. ¡Yah!
Garconis
1

es decir, registrar una taxonomía MY_NEW_CARSSpersonalizada para tipos de publicaciones personalizadas

$my_taxon_name  = 'MY_NEW_CARSS';
$my_post_types  = array('SUB_CAT_1','SUB_CAT_2','SUB_CAT_3');


//REGISTER CUSTOM TAXONOMY ( http://codex.wordpress.org/Function_Reference/register_taxonomy )
//If you aim to register HIERARCHICAL(Parent-ed) post type, read this warning: https://codex.wordpress.org/Function_Reference/register_post_type#hierarchical
add_action( 'init', 'my_f32' ); function my_f32() { 
    register_taxonomy( $GLOBALS['my_taxon_name'], array(), 
        array( 
            'label'=>$GLOBALS['my_taxon_name'],     'public'=>true, 'show_ui'=>true,  'show_admin_column'=>true,   'query_var'=>true,
            'hierarchical'=>true,   'rewrite'=>array('with_front'=>true,'hierarchical'=>true),  
             ));
}

//REGISTER CUSTOM POST TYPE ( http://codex.wordpress.org/Function_Reference/register_post_type )
add_action( 'init', 'myf_63' );function myf_63() { 

    foreach ($GLOBALS['my_post_types'] as $each_Type)       {
            register_post_type( $each_Type, 
                array( 
                    'label'=>$each_Type,     'labels' => array('name'=>$each_Type.' pagess', 'singular_name'=>$each_Type.' page'),        'public' => true,   'publicly_queryable'=> true,      'show_ui'=>true,      'capability_type' => 'post',      'has_archive' => true,      'query_var'=> true,     'can_export' => true,                   //'exclude_from_search' => false,     'show_in_nav_menus' => true,  'show_in_menu' => 'edit.php?post_type=page',//true,     'menu_position' => 5,
                    'hierarchical' =>true,
                    'supports' =>array( 'page-attributes', 'title', 'editor', 'thumbnail' ), 
                    'rewrite' => array('with_front'=>true, ),     //    'rewrite' => array("ep_mask"=>EP_PERMALINK ...) OR    'permalink_epmask'=>EP_PERMALINK, 
                ));

            register_taxonomy_for_object_type('category',$each_Type);       //standard categories
            register_taxonomy_for_object_type($GLOBALS['my_taxon_name'] ,$each_Type);   //Custom categories
    }
}
T.Todua
fuente