Cum să Adaugi Câmpuri Personalizate la Taxonomii Personalizate în WordPress în mod CURAT

27 iun. 2012, 21:27:42
Vizualizări: 26.1K
Voturi: 5

Salvarea câmpurilor suplimentare care au fost adăugate la o taxonomie. Doresc cea mai corectă și eficientă modalitate de a face acest lucru. Unde ar trebui să salvez noile câmpuri?

2 soluții posibile sunt:

1) Utilizarea tabelului de opțiuni WordPress așa cum este descris aici... Adăugarea Câmpurilor Personalizate la Taxonomii Personalizate. Această metodă este recunoscută ca "nu foarte curată" și probabil nu este răspunsul corect.

// O funcție callback pentru salvarea câmpurilor personalizate ale taxonomiei
function save_taxonomy_custom_fields( $term_id ) {
if ( isset( $_POST['term_meta'] ) ) {
    $t_id = $term_id;
    $term_meta = get_option( "taxonomy_term_$t_id" );
    $cat_keys = array_keys( $_POST['term_meta'] );
        foreach ( $cat_keys as $key ){
        if ( isset( $_POST['term_meta'][$key] ) ){
            $term_meta[$key] = $_POST['term_meta'][$key];
        }
    }
    //salvează array-ul de opțiuni
    update_option( "taxonomy_term_$t_id", $term_meta );
}
}

2) Adăugarea unui nou tabel așa cum este descris aici Taxonomii Personalizate în WordPress care urmează convenția de denumire 'wp_' + customtaxonomykey + 'meta'.

3) O altă opțiune

0
Toate răspunsurile la întrebare 5
1
14

Puteți salva ID-ul atașamentului în tabelul de opțiuni și apoi îl puteți afișa

Există trei funcții principale pentru a adăuga meta box-ul pentru taxonomie. Acestea sunt invocate prin următoarele hook-uri:

  1. {taxonomy_name}_add_form_fields
  2. {taxonomy_name}_edit_form_fields
  3. edited_{taxonomy_name}
  4. create_{taxonomy_name}

Aici puteți înlocui taxonomy_name cu orice taxonomie predefinită sau personalizată. Eu folosesc "Taxonomia de produse Woocommerce" și am creat un plugin pentru aceasta. Vă rugăm să examinați următoarele funcții pentru a adăuga câmpuri personalizate:

{taxonomy_name}_add_form_fields adaugă un câmp personalizat în formularul de adăugare a unui termen nou. Aici creez un câmp pentru a adăuga o Clasă pentru termen.

Adăugați următorul cod în functions.php din tema dumneavoastră

public function mj_taxonomy_add_custom_meta_field() {
            ?>
            <div class="form-field">
                <label for="term_meta[class_term_meta]"><?php _e( 'Adaugă Clasă', 'MJ' ); ?></label>
                <input type="text" name="term_meta[class_term_meta]" id="term_meta[class_term_meta]" value="">
                <p class="description"><?php _e( 'Introduceți o valoare pentru acest câmp','MJ' ); ?></p>
            </div>
        <?php
        }
    add_action( 'product_cat_add_form_fields', 'mj_taxonomy_add_custom_meta_field', 10, 2 );

{taxonomy_name}_edit_form_fields adaugă un câmp în pagina de editare a termenului

public function mj_taxonomy_edit_custom_meta_field($term) {

        $t_id = $term->term_id;
        $term_meta = get_option( "taxonomy_$t_id" ); 
       ?>
        <tr class="form-field">
        <th scope="row" valign="top"><label for="term_meta[class_term_meta]"><?php _e( 'Adaugă Clasă', 'MJ' ); ?></label></th>
            <td>
                <input type="text" name="term_meta[class_term_meta]" id="term_meta[class_term_meta]" value="<?php echo esc_attr( $term_meta['class_term_meta'] ) ? esc_attr( $term_meta['class_term_meta'] ) : ''; ?>">
                <p class="description"><?php _e( 'Introduceți o valoare pentru acest câmp','MJ' ); ?></p>
            </td>
        </tr>
    <?php
    }

add_action( 'product_cat_edit_form_fields','mj_taxonomy_edit_custom_meta_field', 10, 2 );

public function mj_save_taxonomy_custom_meta_field( $term_id ) {
        if ( isset( $_POST['term_meta'] ) ) {

            $t_id = $term_id;
            $term_meta = get_option( "taxonomy_$t_id" );
            $cat_keys = array_keys( $_POST['term_meta'] );
            foreach ( $cat_keys as $key ) {
                if ( isset ( $_POST['term_meta'][$key] ) ) {
                    $term_meta[$key] = $_POST['term_meta'][$key];
                }
            }
            // Salvează array-ul de opțiuni
            update_option( "taxonomy_$t_id", $term_meta );
        }

    }  
add_action( 'edited_product_cat', 'mj_save_taxonomy_custom_meta_field', 10, 2 );  
add_action( 'create_product_cat', 'mj_save_taxonomy_custom_meta_field', 10, 2 );
8 feb. 2017 19:33:28
Comentarii

Mulțumesc pentru răspunsurile tale! Te rog să modifici răspunsurile tale și să adaugi câteva informații despre ce face acest cod și cum rezolvă problema inițială?

Howdy_McGee Howdy_McGee
8 feb. 2017 20:43:48
1

Opțiunea 2 este cea mai curată metodă - pe care am folosit-o și eu de mai multe ori. Din păcate, nu există încă un tabel implicit term_metadata în WordPress. Acest articol acoperă aceeași abordare, http://shibashake.com/wordpress-theme/add-term-or-taxonomy-meta-data

Și bineînțeles, există și un plugin pentru asta :) http://wordpress.org/extend/plugins/taxonomy-metadata/

27 iun. 2012 23:41:19
Comentarii

Excelent tutorial. Foarte ușor! Mulțumesc. (desigur, am vrut să fac propria mea soluție, deoarece plugin-urile sunt prea ușoare ca soluție!)

csi csi
28 iun. 2012 18:38:37
0

1) Tabelul implicit wp_options

Chiar nu înțeleg de ce unii propun

update_option( "taxonomy_term_$t_id", $term_meta );

când putem avea o singură opțiune, ale cărei indecși sunt ID-ul Termenului și câmpurile personalizate ca valori

$options = get_option( 'taxonomy_term_meta' );
$options[$t_id] = $term_meta;
update_option( 'taxonomy_term_meta', $options );

și apoi pur și simplu extragem opțiunea și obținem valoarea stocată pentru un anumit ID de Termen

$options = get_option( 'taxonomy_term_meta' );
echo $options[$tax->term_id];

2) Tabelul personalizat wp_taxonomymeta

Asta face plugin-ul Taxonomy Metadata, menționat de James. Și este destul de simplu, odată ce acest tabel este creat, funcțiile add_, get_, update_ și delete_<b>metadata</b> vor începe să funcționeze cu 'taxonomy'. Astfel:

function add_term_meta($term_id, $meta_key, $meta_value, $unique = false) {
    return add_metadata('taxonomy', $term_id, $meta_key, $meta_value, $unique);
}

function delete_term_meta($term_id, $meta_key, $meta_value = '') {
    return delete_metadata('taxonomy', $term_id, $meta_key, $meta_value);
}

function get_term_meta($term_id, $key, $single = false) {
    return get_metadata('taxonomy', $term_id, $key, $single);
}

function update_term_meta($term_id, $meta_key, $meta_value, $prev_value = '') {
    return update_metadata('taxonomy', $term_id, $meta_key, $meta_value, $prev_value);
}

3) Tipul de Post Helper

După cum este descris în răspunsul lui Matthew Boynes (cred că cineva menționează acest lucru și în tichetul #10142.

4) În afara cutiei

În codul plugin-ului, există un link către Tichetul Core #10142 care discută toate acestea. Este un tichet vechi de 4 ani, (closed)(maybelater), mulți dezvoltatori au intervenit, dar nu s-a ajuns la nicio concluzie.

La final, avem această perlă (sublinierile mele):

paco pepe
Deoarece am nevoie de acest lucru în mod regulat, am creat propria soluție: Folosește în mod abuziv câmpul "description" ca container de stocare pentru un array serializat. Singurul lucru care a fost puțin complicat a fost afișarea descrierii simple în interfața de administrare. Oricum, aceasta ar fi soluția la care speram: Pur și simplu convertiți câmpul de descriere în loc să adăugați o grămadă de câmpuri noi. Dacă există nevoie, atunci vom vedea cazurile de utilizare după ce o vom avea și vom merge către o soluție căutabilă într-o versiune ulterioară.

Destul de ingenios.

21 oct. 2013 23:26:42
2

Cea mai bună răspuns este (3) O altă opțiune.

Aceasta este puțin neconvențională, dar se scalează cel mai bine, utilizează nucleul WordPress la maxim și nu necesită adăugarea unei tabele în baza de date: Adăugați un tip de post ascuns pentru taxonomie. Fiecare termen din taxonomie va avea propriul post în acest tip de post. În acest fel, metadatele termenului pot fi stocate ca metadate ale postului. Iată un exemplu de utilizare a acestei abordări.

Principalele probleme cu orice altă abordare (inclusiv opțiunea "utilizați câmpul de descriere al termenului pentru a stoca date serializate") sunt scalabilitatea, performanța și compatibilitatea.

22 oct. 2013 00:14:59
Comentarii

Bine amintit, voi schimba numerotarea mea.

brasofilo brasofilo
22 oct. 2013 00:21:25

Nu doar cu un tip de postare personalizat ascuns. Dacă un termen este asociat cu o singură postare, de tip postare sau pagină. Atunci meta-ul termenului poate stoca ID-ul acelei postări și putem crea o mulțime de câmpuri personalizate pentru acea postare care există pentru a avea o relație cu un termen din taxonomia noastră personalizată. Indiferent de abordarea ta. Recomand cu căldură să creezi o protecție împotriva ștergerii termenilor personalizați dacă aceștia conțin atât de mult meta și sunt legați de postări. Fac asta acum în WP e-Customers pentru că ștergerea unui termen ar putea crea haos dacă meta-ul termenului este necesar și în utilizare.

Ryan Bayne Ryan Bayne
3 feb. 2014 01:33:43
0

https://wordpress.org/plugins/taxonomy-metadata/

Puteți personaliza prin intermediul plugin-ului menționat mai sus..

18 ian. 2017 22:01:20