it-swarm.com.de

Hinzufügen von benutzerdefinierten Feldern zu benutzerdefinierten Taxonomien in WordPress

Speichern zusätzlicher Felder, die zu einer Taxonomie hinzugefügt wurden. Ich möchte den angemessensten und effizientesten Weg, dies zu tun. Wo soll ich die neuen Felder speichern?

2 mögliche Lösungen sind zu

1) Verwenden Sie die Wordpress-Optionstabelle wie hier beschrieben ... Benutzerdefinierte Felder zu benutzerdefinierten Taxonomien hinzufügen . Dies ist zugegebenermaßen "nicht sauber" und es wird angenommen, dass dies nicht die richtige Antwort ist.

// A callback function to save our extra taxonomy field(s)
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];
        }
    }
    //save the option array
    update_option( "taxonomy_term_$t_id", $term_meta );
}
}

2) Fügen Sie wie hier beschrieben eine neue Tabelle hinzu Benutzerdefinierte Taxonomien in Wordpress , die der Namenskonvention von 'wp_' + customtaxonomykey + 'meta' folgt.

3) Eine andere Option

2
csi

Option 2 ist die sauberste Methode - die ich auch einige Male verwendet habe. Leider gibt es in WordPress noch keine standardmäßige term_metadata-Tabelle. Dieser Beitrag behandelt auch den gleichen Ansatz, http://shibashake.com/wordpress-theme/add-term-or-taxonomy-meta-data

Und natürlich gibt es auch dafür ein Plugin :) http://wordpress.org/extend/plugins/taxonomy-metadata/

3
James

1) Standard wp_options Tabelle

Ich verstehe wirklich nicht, warum Leute vorschlagen

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

wenn wir eine einzige Option haben können, deren Indizes die Term-ID und die benutzerdefinierten Felder als Werte sind

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

und dann ziehen Sie einfach die Option und erhalten Sie den Wert für eine bestimmte Term-ID gespeichert

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

2) Benutzerdefinierte wp_taxonomymeta Tabelle

Das macht das Plugin Taxonomy Metadata , das von James verlinkt wurde. Und es ist ganz einfach: Sobald diese Tabelle erstellt ist, arbeiten die Funktionen add_, get_, update_ und delete_metadata mit 'taxonomy'. Wie so:

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

Wie in Matthew Boynes answer beschrieben (ich glaube, jemand erwähnt dies auch im Ticket # 10142).

4) Außerhalb der Box

Im Plugin-Code gibt es einen Link zum Core Ticket # 10142 , in dem das alles besprochen wird. Es ist ein 4 Jahre altes Ticket, (closed)(maybelater), viele Entwickler sind reingesprungen, aber es wurde keine Schlussfolgerung gezogen.

Am Ende haben wir dieses Nugget (meine Betonung):

 paco pepe 
Da ich dies regelmäßig benötige, habe ich meine eigene Lösung geschrieben: Verwendet das Feld "description" als Speichercontainer für ein serialisiertes Array. Das einzige, was ein wenig schwierig war, war die Anzeige der einfachen Beschreibung in der Admin-Benutzeroberfläche. Auf jeden Fall wäre dies die Lösung, auf die ich gehofft habe: Konvertieren Sie einfach das Beschreibungsfeld, anstatt eine Reihe neuer Felder hinzuzufügen. Wenn es erforderlich ist, werden wir die Anwendungsfälle nach Erhalt anzeigen und nach einer durchsuchbaren Lösung mit einer späteren Version suchen.

Prettyclever.

2
brasofilo

Die beste Antwort ist (3) Eine andere Option .

Dies ist ein wenig unkonventionell, skaliert aber am besten, nutzt den Kern am meisten und erfordert nicht das Hinzufügen einer Datenbanktabelle: Fügen Sie einen verborgenen Beitragstyp für die Taxonomie hinzu. Jeder Begriff in der Taxonomie erhält einen eigenen Beitrag im Beitragstyp. Damit kann der Begriff Meta als Post-Meta gespeichert werden. Hier ist ein Beispiel für die Verwendung dieses Ansatzes .

Die Hauptprobleme bei jedem anderen Ansatz (einschließlich der Option "Verwenden Sie das Beschreibungsfeld des Begriffs, um serialisierte Daten zu speichern") sind Skalierbarkeit, Leistung und Kompatibilität.

2
Matthew Boynes

Sie können Anhang-ID in der Optionstabelle speichern und erhalten, um diesen Anhang anzuzeigen

Es gibt drei Hauptfunktionen, um die Meta-Box für die Taxonomie hinzuzufügen. Diese werden über die folgenden Hooks aufgerufen:

  1. {Taxonomiename} _ Formularfelder hinzufügen
  2. {taxonomy_name} _ edit_form_fields
  3. bearbeitete _ {taxonomy_name}
  4. erstelle _ {taxonomy_name}

Hier können Sie den Taxonomienamen mit jeder vordefinierten oder benutzerdefinierten Taxonomie entsprechend ändern. Ich verwende die Woocommerce-Produkttaxonomie und habe ein Plug-in für diese erstellt. Überprüfen Sie die folgenden Funktionen, um ein benutzerdefiniertes Feld hinzuzufügen:

{taxonomy_name} _add_form_fields füge ein neues benutzerdefiniertes Feld hinzu, um ein neues Ausdrucksformular hinzuzufügen. Hier erstelle ich ein Feld, um eine Klasse für den Ausdruck hinzuzufügen.

Fügen Sie den folgenden Code in functions.php in Ihr Theme ein

public function mj_taxonomy_add_custom_meta_field() {
            ?>
            <div class="form-field">
                <label for="term_meta[class_term_meta]"><?php _e( 'Add Class', 'MJ' ); ?></label>
                <input type="text" name="term_meta[class_term_meta]" id="term_meta[class_term_meta]" value="">
                <p class="description"><?php _e( 'Enter a value for this field','MJ' ); ?></p>
            </div>
        <?php
        }
    add_action( 'product_cat_add_form_fields', 'mj_taxonomy_add_custom_field', 10, 2 );

{taxonomy_name} _edit_form_fields fügt ein Feld auf der Termbearbeitungsseite hinzu

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( 'Add Class', '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( 'Enter a value for this field','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];
                }
            }
            // Save the option array.
            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 );
1
shishir mishra

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

Sie können über das oben erwähnte Plugin angepasst werden.

0
shishir