Tassonomia personalizzata specifica per un tipo di posta personalizzato


29

Voglio creare una tassonomia personalizzata che si comporta in modo simile al tipo di post poiché una categoria si comporta con i post predefiniti (in base alla struttura /% category% /% postname% / permalink) in modo che i post nei tipi di post personalizzati siano visualizzato come www.example.com/custom-post-type/custom-taxonomy-name/post-name Inoltre voglio che la meta-box della categoria appaia solo quando aggiungiamo un nuovo post predefinito e non quando aggiungiamo un nuovo post nell'abitudine tipo di post e la casella della tassonomia personalizzata vengono visualizzati solo quando aggiungiamo un nuovo post nel tipo di post personalizzato e non quando aggiungiamo un nuovo post predefinito.

Risposte:


46

Prima di tutto se si desidera mostrare la tassonomia metabox solo al tipo di post personalizzato, quindi registrare la tassonomia solo a quel tipo di post personalizzato passando il nome del tipo di post personalizzato come argomento in register_taxonomy. In questo modo il metabox della tassonomia appare solo per il tipo di posta personalizzato. Se non vuoi mostrare la categoria metabox al tipo di post personalizzato, rimuovi il termine categoria come argomento durante la registrazione del tipo di post personalizzato e includi invece il nome della lumaca tassonomia come questo 'taxonomies' => array ('post_tag', 'your_taxonomy_name') . ecco il codice come l'ho raggiunto. Ho registrato una tassonomia personalizzata con temi_categorie di lumache in temi di tipo di posta personalizzati


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

Quindi per cambiare il permalink ho creato la seguente funzione


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

Quindi ho registrato un tipo di post personalizzato con temi di lumache come di seguito


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

Ci sono alcune cose che devi ricordare quando registri post personalizzati. cambia il parametro has_archive con il nome della lumaca del tipo di messaggio personalizzato e un altro è cambia il nome della lumaca riscrivere come 'slug' => 'custom_post_type_slug /% taxonomy_slug%

Ora quando aggiungi un nuovo tipo di post nella pagina del tipo di post di scrittura ... vedrai il permalink come http://www.example.com/wordpress/themes/%themes_categories%/post-name/ . Se la tassonomia personalizzata per questo post non è selezionata, il permalink rimarrà http://www.example.com/wordpress/themes/%themes_categories%/post-name/ che mostrerà quindi una richiesta errata. Per correggere ciò, creiamo un termine predefinito nella tassonomia personalizzata. (uguale a non classificato nelle categorie) Aggiungi questo 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 );

Ora quando la tassonomia personalizzata viene lasciata vuota, il permlaink diventa automaticamente http://www.example.com/wordpress/themes/other/post-name/ .

Alla fine non dimenticare di cancellare la riscrittura facendo clic su Salva modifiche nelle impostazioni permalink nella sezione admin altrimenti verrai reindirizzato all'errore 404. Spero che questo ti aiuti.


Ehi, ho avuto un problema ... quando abbiamo inviato il link all'archivio tassonomia usando l'eco get_the_term_list ($ post-> ID, $ tassonomia, '', ',', ''); quindi il collegamento appare come www.example.com/taxonomy-term e non www.example.com/themes/taxonomy-term. Penso che dobbiamo scrivere una regola HTACESS per questo.
Saurabh Goel,

+1, ottima spiegazione, seguito passo dopo passo e funziona, testato su WordPress 3.4.2
Alex Vang

1
Mi chiedevo: devi aggiungere tassonomia personalizzata alla matrice di tassonomie quando registri un tipo di posta personalizzato? Perché sembra funzionare senza aggiungerlo anche lì (se si registra già una tassonomia nel tipo di post personalizzato). Solo curioso.
trainoasi,

Ho provato questo con il plug-in dell'interfaccia utente CPT mentre si utilizza ancora la riscrittura per modificare l'URL. Tutto sembra a posto. gli URL sono tutti corretti e ho resettato i permalink, ma i post effettivi generano un 404. :( EDIT: nevermind. Ho esaminato e rimosso Gerarchico dalla tassonomia e mi sono anche assicurato di salvare le cose nell'ordine corretto, e ora i post sembra funzionare Yah!
Garconis,

1

cioè registrare una tassonomia MY_NEW_CARSSpersonalizzata per i tipi di posta personalizzati:

$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
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.