Taxonomia personalizada específica para um tipo de postagem personalizada

29

Desejo criar uma taxonomia personalizada que se comporte de maneira semelhante ao tipo de postagem como uma categoria se comporte às postagens padrão (com base na estrutura /% category% /% postname% / permalink) para que as postagens nos tipos de post personalizados sejam exibida como www.example.com/custom-post-type/custom-taxonomy-name/post-name Também quero que a caixa meta da categoria apareça apenas quando adicionarmos uma nova postagem padrão e não quando adicionarmos uma nova postagem no costume o tipo de postagem e a caixa de taxonomia customizada para aparecer somente quando adicionarmos uma nova postagem no tipo de postagem personalizada e não quando adicionarmos uma nova postagem padrão.

Saurabh Goel
fonte

Respostas:

46

Antes de tudo, se você deseja mostrar a metabox da taxonomia apenas para o tipo de postagem personalizado, registre a taxonomia apenas para esse tipo de postagem personalizada, passando o nome do tipo de postagem personalizado como argumento em register_taxonomy. Ao fazer isso, a metabox da taxonomia aparece apenas no tipo de postagem personalizada. Se você não deseja mostrar a metabox da categoria ao tipo de postagem personalizado, remova a categoria de termo como argumento ao registrar o tipo de postagem personalizada e inclua o nome da lesma de taxonomia como este 'taxonomies' => array ('post_tag', 'your_taxonomy_name') . Aqui está o código de como eu consegui isso. Registrei uma taxonomia personalizada com slug themes_categories em sob temas de tipo de postagem personalizados


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');

Em seguida, para alterar o link permanente que eu criei após a função


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);

Em seguida, registrei um tipo de postagem personalizado com temas slug como abaixo


//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
}  

Você precisa se lembrar de algumas coisas ao registrar uma postagem personalizada. altere o parâmetro has_archive para nome do slug de tipo de postagem personalizado e outro é altere o nome do slug de reescrita como 'slug' => 'custom_post_type_slug /% taxonomy_slug%

Agora, quando você adiciona um novo tipo de postagem na página de tipo de postagem de gravação ... você verá o link permanente como http://www.example.com/wordpress/themes/%themes_categories%/post-name/ . Se a taxonomia personalizada para esta postagem não for selecionada, o link permanente permanecerá http://www.example.com/wordpress/themes/%themes_categories%/post-name/, que mostrará uma solicitação incorreta. Para corrigir isso, criamos um termo padrão na taxonomia customizada. (o mesmo que não categorizado em categorias) Adicione isso 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 );

Agora, quando a taxonomia personalizada é deixada em branco, o permlaink se torna http://www.example.com/wordpress/themes/other/post-name/ automaticamente.

Por fim, não esqueça de liberar a reescrita clicando em salvar alterações na configuração de permalink na seção admin, caso contrário você será redirecionado para o erro 404. Espero que isso ajude você.

Rabin shrestha
fonte
Ei, eu tive um problema ... quando exibimos o link para o arquivo de taxonomia usando o eco get_the_term_list ($ post-> ID, $ taxonomy, '', ',', ''); o link aparecerá como www.example.com/taxonomy-term e não www.example.com/themes/taxonomy-term. Acho que precisamos escrever uma regra HTACESS para isso.
Saurabh Goel
+1, ótima explicação, seguida passo a passo e funciona, testado no WordPress 3.4.2 #
Alex Vang
1
Eu estava pensando: você precisa adicionar taxonomia personalizada à matriz de taxonomias ao registrar um tipo de postagem personalizado? Porque parece estar funcionando sem adicioná-lo também (se você já registrar uma taxonomia no tipo de postagem personalizada). Apenas curioso.
trainoasis
Tentei isso com o plug-in da interface do usuário do CPT enquanto ainda estava usando sua reescrita para alterar o URL. Tudo parece bom. os URLs estão todos corretos e eu redefino os links permanentes, mas as postagens reais lançam um 404. :( EDIT: deixa pra lá. Passei e removi o Hierarchical da taxonomia e também certifiquei-me de salvar as coisas na ordem correta e agora as postagens parece funcionar .. Yah!
Garconis 17/05/19
1

ou seja, registre uma taxonomia MY_NEW_CARSSpersonalizada para tipos de postagem personalizados:

$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
fonte