Cum să adaugi etichete (tags) la un tip de postare personalizat?
Am un tip de postare personalizat numit portfolio
și încerc să adaug taxonomia de etichete la acesta, cum pot face acest lucru?

Sau pur și simplu adaugă:
'taxonomies' => array('post_tag')
Un array de taxonomii înregistrate precum
category
saupost_tag
care vor fi utilizate cu acest tip de postare. Aceasta poate fi folosită în locul apelării directe a funcțieiregister_taxonomy_for_object_type()
. Taxonomiile personalizate încă trebuie să fie înregistrate curegister_taxonomy()
.
în array-ul $args
din fișierul functions.php
unde creezi tipul de postare personalizat cu register_post_type()
. Aceasta va adăuga un tip de postare personalizat pentru a folosi aceleași categorii și/sau etichete ca postările implicite.

Ca acesta: (Unde scrie "portfolio" este locul unde înregistrați taxonomia pentru un tip de postare)
add_action( 'init', 'create_tag_taxonomies', 0 );
//crează două taxonomii, genuri și etichete pentru tipul de postare "tag"
function create_tag_taxonomies()
{
// Adaugă o nouă taxonomie, NU ierarhică (ca etichetele)
$labels = array(
'name' => _x( 'Etichete', 'taxonomy general name' ),
'singular_name' => _x( 'Etichetă', 'taxonomy singular name' ),
'search_items' => __( 'Caută Etichete' ),
'popular_items' => __( 'Etichete Populare' ),
'all_items' => __( 'Toate Etichetele' ),
'parent_item' => null,
'parent_item_colon' => null,
'edit_item' => __( 'Editează Eticheta' ),
'update_item' => __( 'Actualizează Eticheta' ),
'add_new_item' => __( 'Adaugă Etichetă Nouă' ),
'new_item_name' => __( 'Nume Etichetă Nouă' ),
'separate_items_with_commas' => __( 'Separați etichetele cu virgule' ),
'add_or_remove_items' => __( 'Adaugă sau elimină etichete' ),
'choose_from_most_used' => __( 'Alege dintre cele mai folosite etichete' ),
'menu_name' => __( 'Etichete' ),
);
register_taxonomy('tag','portfolio',array(
'hierarchical' => false,
'labels' => $labels,
'show_ui' => true,
'update_count_callback' => '_update_post_term_count',
'query_var' => true,
'rewrite' => array( 'slug' => 'tag' ),
));
}
?>

@JoeBobby ar fi probabil util să consulți pagina WordPress Codex pentru înregistrarea taxonomiilor pentru a înțelege mai bine toate opțiunile disponibile: http://codex.wordpress.org/Function_Reference/register_taxonomy

Doar o observație că acest lucru creează o taxonomie complet nouă numită 'tag' în loc să adauge taxonomia existentă 'post_tag' la tipul de postare personalizat.

@chifliiiii cum să obții aceste etichete în pagina single a postării cu linkuri către etichete, cum să creezi un șablon pentru pagina de etichete

Sunt de acord cu Jake, simt că aceasta nu rezolvă problema. Răspunsul lui @Marcus ar trebui să fie cel marcat ca acceptat.

cum pot accesa template-ul pentru această taxonomie 'tag'? Care este numele template-ului?

Metoda 1 (din răspunsurile de mai sus: https://wordpress.stackexchange.com/a/106211/38771)
Diferite tipuri de postări vor folosi aceleași date "Tag-uri" ca tipul implicit "post".
Beneficii
Totul (ar trebui să) funcționeze imediat cu o singură linie de cod
Toate tag-urile într-un singur loc în CMS
Dezavantaje
- Uită de un CMS bine structurat / ușor de utilizat - lista de Tag-uri pe pagina tipurilor de postări personalizate va afișa toate Tag-urile (nu doar cele utilizate în articolele tipului personalizat) cu numărarea greșită...
- Modificările la un Tag vor afecta atât articolele implicite "post", cât și cele ale tipului personalizat (Ștergerea unui Tag îl va șterge în ambele tipuri de articole)
- Mai greu (posibil imposibil) de configurat orice funcționalitate distinctă pentru Tag-uri: descrieri diferite, câmpuri personalizate, imagini, etc (cel puțin nu fără mult cod personalizat peste codul de bază Wordpress)...
Metoda 2 (din răspunsurile de mai sus: https://wordpress.stackexchange.com/a/62263/38771)
Diferite tipuri de postări folosesc configurații/date diferite pentru "Tag-uri".
Beneficii
- Creare de funcționalități diferite/clar distincte legate de tag-uri: șabloane frontend, capabilități, filtre de interogare, acțiuni)
- Atribuire de date diferite legate de tag-uri: date de câmpuri sau chiar câmpuri personalizate
- Gestionare mai bună a Tag-urilor în CMS
- Exemplu: Editarea/Ștergerea unui tag "post" nu va afecta tag-ul (cu nume/slug similar) pentru celelalte tipuri de postări
Compromis
Un pic mai mult cod pentru configurare
În realitate, acestea sunt un mod extrem de puternic de a grupa diverse elemente în tot felul de moduri. https://codex.wordpress.org/Taxonomies#Custom_Taxonomies

Iată un caz pentru Metoda 1: Un site sportiv mare, care acoperă numeroase subiecte/liga/sporturi cu etichete precum "NBA", "NHL", "Baschet", "Olimpiade", "Steroizi", "Universitate", etc. Nu are niciun sens să duplicăm și să gestionăm ceea ce ar putea fi peste 100 de etichete și 4 tipuri de articole (tipul implicit de articol și 3 tipuri personalizate de articole). În ceea ce privește dezavantajele, dacă datele despre numărul de etichete sunt atât de speciale, atunci se poate crea o vizualizare personalizată pentru asta. În ceea ce privește etichetele personalizate similare pe tip de articol, nu pare să existe vreo nevoie evidentă până acum (încercând să mă gândesc la una... am nevoie de exemple).

Da, dar nu vor exista automat permalinkuri diferite pentru etichete în funcție de tipul de articol. O etichetă "playoffs" va avea "/tag/playoffs" pentru toate tipurile de articole. Apoi, trebuie să configurezi reguli de rescriere sau să folosești parametri GET pentru a crea permalinkuri diferite... Cu o taxonomie diferită pentru fiecare tip de articol, fiecare etichetă "playoffs" pentru fiecare tip de articol va avea propriul permalink, care poate fi personalizat folosind Ierarhia de Șabloane WordPress. Este benefic dacă paginile "playoffs" sunt diferite pentru NBA, NHL... Am lucrat la un site cu acest nivel de personalizare pentru taxonomii (câmpuri personalizate, imagine pentru taxonomie, descriere)

Înțeleg ce spui. Deci, dacă alegem să avem taxonomii de etichete diferite pentru fiecare CPT, ce zici să facem astfel încât atunci când adaugi/editezi un termen într-o taxonomie, acesta să se modifice și în celelalte taxonomii, adică să avem termeni unici sincronizați între taxonomii. De exemplu, definești "Baschet" o singură dată, să zicem în taxonomia de etichete a articolelor, iar după ce apeși salvează, atunci "Baschet" este creat în mod unic și în celelalte taxonomii pentru CPT-uri. Astfel, introduci/editezi o etichetă o singură dată, iar modificarea se reflectă în mai multe taxonomii de etichete. În final, obții gestionarea etichetelor într-un singur loc, plus o situație de permalinkuri mai dorită.

Da, asta ar fi de fapt o metodă excelentă dacă site-ul folosește aceleași informații de bază ale taxonomiilor (titlu) pentru mai multe CPT-uri, oferind în același timp posibilitatea de a personaliza aceste taxonomii (câmpuri personalizate, imagini etc) pentru diferite CPT-uri. Foarte tare!

Poți folosi acest cod, poate te va ajuta
add_action( 'init', 'create_client_tax' );
function create_client_tax() {
register_taxonomy(
'client_tag', //taxonomia ta pentru etichete
'client', // Tipul tău de postare
array(
'hierarchical' => false,
'label' => __( 'Etichete', CURRENT_THEME ),
'singular_name' => __( 'Etichetă', CURRENT_THEME ),
'rewrite' => true,
'query_var' => true
)
);
}

Aceasta funcționează întotdeauna bine. ref: https://developer.wordpress.org/plugins/post-types/registering-custom-post-types/
/**
* Crează taxonomii tag pentru CPT portfolio
*/
if ( ! function_exists( 'ns_register_team_category' ) ) {
function ns_register_team_category() {
$labels = array(
'name' => __( 'Etichete', 'ns' ),
'singular_name' => __( 'Etichetă', 'ns' ),
'search_items' => __( 'Caută Etichete' ),
'popular_items' => __( 'Etichete Populare' ),
'all_items' => __( 'Toate Etichetele' ),
'parent_item' => null,
'parent_item_colon' => null,
'edit_item' => __( 'Editează Eticheta' ),
'update_item' => __( 'Actualizează Eticheta' ),
'add_new_item' => __( 'Adaugă Etichetă Nouă' ),
'new_item_name' => __( 'Nume Etichetă Nouă' ),
'separate_items_with_commas' => __( 'Separați etichetele cu virgule' ),
'add_or_remove_items' => __( 'Adaugă sau elimină etichete' ),
'choose_from_most_used' => __( 'Alege din cele mai folosite etichete' ),
'menu_name' => __( 'Etichete' ),
);
$args = array(
'label' => __( 'Etichetă', 'ns' ),
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'hierarchical' => true,
'show_ui' => true,
'show_in_menu' => true,
'show_in_nav_menus' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'eticheta', 'with_front' => false, ),
'show_admin_column' => false,
'show_in_rest' => true,
'rest_base' => 'eticheta',
'rest_controller_class' => 'WP_REST_Terms_Controller',
'show_in_quick_edit' => true,
'update_count_callback' => '_update_post_term_count',
);
register_taxonomy( 'eticheta', array( 'portfolio' ), $args );
}
add_action( 'init', 'ns_register_team_category', 0 );
}

Poți adăuga o taxonomie deja înregistrată la un tip de obiect, vezi codul de mai jos.
/**
* Funcție pentru a adăuga selecția de etichete la un tip de postare personalizat
*/
function ns_reg_tag() {
register_taxonomy_for_object_type('post_tag', 'Custom_Post_Type');
}
add_action('init', 'ns_reg_tag');

Deși răspunsul lui Marcus rezolvă majoritatea problemei, trebuie să știți că nu este o soluție completă. Răspunsul lui chifliiiii este mai complet, dar, așa cum s-a menționat în comentarii, nu refolosește taxonomia de taguri deja existentă.
Conform OP, o soluție trebuie să folosească „taxonomia de taguri” și nu „o taxonomie de taguri”. De aceea cred că răspunsul lui chifliiiii este incorect.
Pe de altă parte, cred că răspunsul lui Marcus este parțial corect, la fel și răspunsurile similare precum cel postat de Giovanni Putignano. Voi explica mai jos de ce.
O soluție completă
Prin înregistrarea tipului de postare personalizat la taxonomia post_tag
, folosind fie metoda sugerată de Marcus, fie cea a lui Giovanni, postările etichetate ale tipului de postare personalizat nu vor fi afișate pe pagina de arhivă a tagului. Vor fi afișate doar postări de tipul post
, deoarece șablonul încorporat pentru taguri este randat cu o interogare care vizează doar tipul de postare post
. Pentru a remedia acest lucru, trebuie să modificați interogarea cu hook-ul pre_get_posts
.
Aceasta este o metodă generică de a rezolva această problemă (nu mă întrebați de ce nu este implementată în nucleu):
add_action('pre_get_posts', function($query) {
// Aceasta va vizualiza interogările folosite pentru a genera șablonul de arhivă pentru taguri.
// Puteți elimina condiția `is_main_query()` dacă doriți să obțineți postări
// după tag în afara buclei.
if (!is_admin() && is_tag() && $query->is_main_query()) {
// Va seta ceva de genul: Array( 'post', 'portfolio' )
$types = get_taxonomy('post_tag')->object_type;
// Modifică interogarea pentru a folosi doar tipurile care sunt înregistrate la
// taxonomia `post_tag`.
$query->set('post_type', $types);
}
});

În cazul meu, următorul cod a funcționat.
register_taxonomy( 'events_tag',array('events'), array(
'hierarchical' => false,
'label' => 'Tag',
'show_admin_column' => true,
'singular_label' => 'Tag-ul tipului tău de postare',
'query_var' => true,
'rewrite' => array( 'slug' => 'events_tag' ),
'show_in_rest' => true,
'rest_base' => 'events_tag',
'rest_controller_class' => 'WP_REST_Terms_Controller',
)
);
