Inserarea unui termen într-o taxonomie personalizată

6 oct. 2014, 05:38:42
Vizualizări: 29.3K
Voturi: 10

Am creat această taxonomie personalizată care va controla aspectul articolelor individuale, practic vreau să adaug două opțiuni, Aspect 1 și Aspect 2.

// Înregistrare Taxonomie Personalizată
function custom_taxonomy() {

    $labels = array(
        'name'                       => _x( 'Aspect', 'Numele General al Taxonomiei', 'text_domain' ),
        'singular_name'              => _x( 'Aspect', 'Numele Singular al Taxonomiei', 'text_domain' ),
        'menu_name'                  => __( 'Taxonomie', 'text_domain' ),
        'all_items'                  => __( 'Toate Elementele', 'text_domain' ),
        'parent_item'                => __( 'Element Părinte', 'text_domain' ),
        'parent_item_colon'          => __( 'Element Părinte:', 'text_domain' ),
        'new_item_name'              => __( 'Nume Element Nou', 'text_domain' ),
        'add_new_item'               => __( 'Adaugă Element Nou', 'text_domain' ),
        'edit_item'                  => __( 'Editează Element', 'text_domain' ),
        'update_item'                => __( 'Actualizează Element', 'text_domain' ),
        'separate_items_with_commas' => __( 'Separați elementele cu virgule', 'text_domain' ),
        'search_items'               => __( 'Caută Elemente', 'text_domain' ),
        'add_or_remove_items'        => __( 'Adaugă sau șterge elemente', 'text_domain' ),
        'choose_from_most_used'      => __( 'Alege dintre cele mai folosite elemente', 'text_domain' ),
        'not_found'                  => __( 'Nu a fost găsit', 'text_domain' ),
    );
    $capabilities = array(
        'manage_terms' => 'foobar',
        'edit_terms'   => 'foobar',
        'delete_terms' => 'foobar',
        'assign_terms' => 'foobar' 
    );
    $args = array(
        'labels'                     => $labels,
        'hierarchical'               => true,
        'public'                     => true,
        'show_ui'                    => true,
        'show_admin_column'          => false,
        'show_in_nav_menus'          => false,
        'show_tagcloud'              => false,
        'capabilities'               => $capabilities,
    );
    register_taxonomy( 'Layout', array( 'post' ), $args );

}

// Conectare la acțiunea 'init'
add_action( 'init', 'custom_taxonomy', 0 );

Capabilitățile sunt setate la valori invalide pentru a împiedica editarea termenilor, dar nu reușesc să fac wp_insert_term să funcționeze.

Adăugarea a doi termeni la taxonomia mea personalizată nu poate fi așa de grea, nu?

Folosind acest cod pentru a insera un termen nu funcționează, deși dacă aș schimba numele taxonomiei mele personalizate în 'category', adică cea implicită WP, funcționează perfect. Care e problema?

function example_insert_category() {
    $parent_term = term_exists( 'layout' ); // array-ul este returnat dacă taxonomia este furnizată
    $parent_term_id = $parent_term['term_id']; // obține id-ul numeric al termenului
    wp_insert_term(
        'Categorie Exemplu',
        'layout',
        array(
          'description' => 'Aceasta este o categorie exemplu creată cu wp_insert_term.',
          'slug'        => 'categorie-exemplu'
        )
    );
}
add_action( 'after_setup_theme', 'example_insert_category' );
1
Comentarii

După cum am promis, am publicat codul pentru plugin. Sper să vă fie de folos :-)

Pieter Goosen Pieter Goosen
7 oct. 2014 19:03:28
Toate răspunsurile la întrebare 1
8
13

EDIT 2

După cum am promis, iată codul pentru plugin.

Este un fapt cunoscut că taxonomiile personalizate și tipurile de postări personalizate ar trebui să fie plasate într-un plugin, și nu în tema dumneavoastră. Am eliminat părți din plugin-ul meu.

CUM FUNCȚIONEAZĂ

Taxonomia este înregistrată în mod normal prin intermediul plugin-ului. Pentru orice informații suplimentare, puteți consulta register_taxonomy. Partea pe care am vrut să o evidențiez și care este relevantă pentru această întrebare, este modul de inserare a termenilor noi.

Inserarea termenilor prin wp_insert_terms este rapidă și ușoară, dar acest cod poate afecta timpul de încărcare dacă nu este utilizat corect. Ideea este să executați acea funcție o singură dată, și apoi niciodată din nou, aproape ca și cum ați elimina-o după prima rulare.

Pentru a realiza acest lucru, veți conecta funcția dumneavoastră la register_activation_hook. Acest hook rulează o singură dată, și anume când plugin-ul este activat, nu se va executa din nou la reîmprospătarea paginii. Singura dată când va fi executat din nou este atunci când plugin-ul este dezactivat și apoi reactivat.

Deci, mai întâi trebuie să vă înregistrați taxonomia, deoarece nu puteți atribui termeni unei taxonomii care nu există. Odată ce taxonomia este înregistrată, puteți insera termenii. Rețineți, această acțiune va avea loc o singură dată, și anume la activarea plugin-ului. Dacă trebuie să adăugați termeni, va trebui să dezactivați plugin-ul și să-l reactivați.

De asemenea, este indicat să verificați mai întâi dacă un termen există înainte de a încerca să-l creați și să-l inserați.

Iată codul plugin-ului:

<?php
/**
Plugin Name: Creare termeni
Plugin URI: http://wordpress.stackexchange.com/q/163541/31545
Description: Crează termeni
Version: 1.0
Author: Pieter Goosen
License: GPLv2 or later
*/
class Test_Terms {

    function __construct() {
        register_activation_hook( __FILE__,array( $this,'activate' ) );
        add_action( 'init', array( $this, 'create_cpts_and_taxonomies' ) );
    } 

    function activate() {
        $this->create_cpts_and_taxonomies();
        $this->register_new_terms();
    }

    function create_cpts_and_taxonomies() {

        $args = array( 
            'hierarchical'                      => true,  
            'labels' => array(
                'name'                          => _x('Taxonomie Test', 'nume general taxonomie' ),
                'singular_name'                 => _x('Taxonomie Test', 'nume singular taxonomie'),
                'search_items'                  => __('Caută Taxonomie Test'),
                'popular_items'                 => __('Taxonomii Test Populare'),
                'all_items'                     => __('Toate Taxonomiile Test'),
                'edit_item'                     => __('Editează Taxonomie Test'),
                'edit_item'                     => __('Editează Taxonomie Test'),
                'update_item'                   => __('Actualizează Taxonomie Test'),
                'add_new_item'                  => __('Adaugă Taxonomie Test Nouă'),
                'new_item_name'                 => __('Nume Taxonomie Test Nouă'),
                'separate_items_with_commas'    => __('Separați Taxonomiile Test cu Virgule'),
                'add_or_remove_items'           => __('Adaugă sau Elimină Taxonomii Test'),
                'choose_from_most_used'         => __('Alege dintre Taxonomiile Test Cele Mai Folosite')
            ),  
            'query_var'                         => true,  
            'rewrite'                           => array('slug' =>'test-tax')        
        );
        register_taxonomy( 'test_tax', array( 'post' ), $args );
    }

    function register_new_terms() {
        $this->taxonomy = 'test_tax';
        $this->terms = array (
            '0' => array (
                'name'          => 'Testator 1',
                'slug'          => 'testator-1',
                'description'   => 'Acesta este un termen de test unu',
            ),
            '1' => array (
                'name'          => 'Testator 2',
                'slug'          => 'testator-2',
                'description'   => 'Acesta este un termen de test doi',
            ),
        );  

        foreach ( $this->terms as $term_key=>$term) {
                wp_insert_term(
                    $term['name'],
                    $this->taxonomy, 
                    array(
                        'description'   => $term['description'],
                        'slug'          => $term['slug'],
                    )
                );
            unset( $term ); 
        }

    }
}
$Test_Terms = new Test_Terms();

EDIT 1

Problema ta cu inserarea termenilor este hook-ul tău. after_setup_theme rulează înainte de init, ceea ce înseamnă că încerci să inserezi un termen într-o taxonomie care nu este încă înregistrată.

Aș sugera să muti funcția ta wp_insert_term în interiorul funcției init, chiar sub register_taxonomy

De asemenea, este recomandat să verifici mai întâi dacă un termen există (term_exists) înainte de a-l insera.

Exemplu:

// Înregistrează Taxonomia Personalizată
function custom_taxonomy() {

   //COD PENTRU ÎNREGISTRAREA TAXONOMIEI

   if( !term_exists( 'Categorie Exemplu', 'layout' ) ) {
       wp_insert_term(
           'Categorie Exemplu',
           'layout',
           array(
             'description' => 'Aceasta este o categorie exemplu creată cu wp_insert_term.',
             'slug'        => 'categorie-exemplu'
           )
       );
   }
}

// Conectează la acțiunea 'init'
add_action( 'init', 'custom_taxonomy', 0 );

Notă: Acest cod nu a fost testat

RĂSPUNS ORIGINAL

Numele de taxonomii personalizate (și numele de tipuri de postări personalizate) trebuie să respecte un set foarte specific de reguli, altfel veți întâmpina probleme pentru care nu există soluții.

Iată câteva recomandări atunci când alegeți nume pentru taxonomii personalizate (și tipuri de postări personalizate):

  1. Următoarele nu sunt permise în numele de taxonomii personalizate și tipuri de postări personalizate:

    • Litere mari sau camelCase

    • Orice fel de caractere speciale, cu excepția underscore-urilor (_)

    • Spații

    • Mai mult de 32 de caractere pentru taxonomii și 20 pentru tipuri de postări

    • Orice nume rezervate, și rețineți, acest lucru se aplică oricăror convenții de denumire personalizate, nu doar numelor de taxonomii.

  2. Dacă există mai mult de un cuvânt într-un nume de taxonomie, acestea trebuie să fie separate prin underscore-uri, nu prin cratime (-). Am fost contestat că cratimele sunt recomandate pentru SEO în URL-uri pentru numele de taxonomii. Este adevărat, de aceea există reguli de rescriere pentru a ajusta URL-ul în consecință. Nu schimbați niciodată numele de taxonomii sau tipuri de postări din motive de SEO pentru URL-uri.

De asemenea, ar trebui să eliminați acele capabilități ciudate. Ele ar putea crea și ele probleme.

Dacă aceasta nu rezolvă problema dumneavoastră, vă rugăm să adăugați codul pe care îl utilizați cu wp_insert_term.

Referințe:

6 oct. 2014 07:35:25
Comentarii

După ce am analizat sursa, sunt puțin nedumerit, deoarece parametrul $taxonomy nu este deloc sanitizat dacă argumentul query_var este setat la true. Este de-a dreptul incredibil. În alte cazuri, este sanitizat prin sanitize_title_with_dashes(), care, așa cum sugerează și numele, va înlocui caractere cu cratime peste tot. Și asta este la fel de greu de crezut, deoarece cratimele nu ar trebui folosite.

Nicolai Grossherr Nicolai Grossherr
6 oct. 2014 21:23:17

Pe lângă faptul că poți folosi numere după bunul plac, oriunde, inclusiv la început, deși peste tot se spune că nu ar trebui să faci asta. Nu am găsit însă un motiv clar împotriva numerelor. Spre deosebire de cratime, unde măcar există o mențiune »De asemenea, dacă tipul de postare conține cratime, nu vei putea adăuga coloane pe pagina de administrare a tipului de postare personalizat (folosind acțiunea 'manage_<Numele Tipului de Postare Personalizat>_posts_columns')« pe pagina codex a funcției register_post_type().

Nicolai Grossherr Nicolai Grossherr
6 oct. 2014 21:24:12

Deși este oarecum ascunsă în secțiunea »Tipuri de Postare Rezervate«. Nu știu dacă astfel de lucruri - potențial sau cu siguranță problematice - ar trebui impuse. Altfel, este doar o invitație la probleme fără un motiv bun.

Nicolai Grossherr Nicolai Grossherr
6 oct. 2014 21:25:55

Wordpress are și el defectele sale, trebuie să recunosc. Unele sunt adevărate crime :-). Cred că liniuțele sunt unul dintre subiectele cele mai discutate și totodată folosite în denumiri. Eșecul său este destul de evident când începi să te uiți la ierarhia de șabloane. Creează o taxonomie cu două cuvinte, cum ar fi my-taxonomy, separate printr-o liniuță, și creează un șablon de taxonomie taxonomy-my-taxonomy.php și vei vedea eșecul. Am citit undeva despre chestia cu numerele, trebuie să verific din nou. Aceasta este o listă de precauții pe care o folosesc mereu pentru a fi în siguranță și a funcționat perfect. Mulțumesc pentru toate informațiile, apreciez.

Pieter Goosen Pieter Goosen
6 oct. 2014 21:41:17

La fel și eu, dar doar pentru că am învățat de la început în mod corect. Cum am învățat majoritatea lucrurilor de pe [wordpress.se] și de la oamenii inteligenți și experimentați de acolo. Așa că sunt multe greșeli pe care nu le-am făcut niciodată de fapt.

Nicolai Grossherr Nicolai Grossherr
6 oct. 2014 21:48:04

Cu plăcere. Distrează-te :-)

Pieter Goosen Pieter Goosen
7 oct. 2014 20:39:57

În opinia mea, acest răspuns ar trebui protejat. Detaliile din acest răspuns/exemplu sunt foarte importante și nu sunt adesea menționate în Codex.

Charles Charles
22 nov. 2015 18:15:33

Cred că verificarea dacă termenul există nu este necesară, deoarece funcția wp_insert_term conține deja o verificare chiar la început.

Anders Östman Anders Östman
20 mar. 2017 11:45:21
Arată celelalte 3 comentarii