Enregistrement de champs supplémentaires ajoutés à une taxonomie. Je veux le moyen le plus approprié et le plus efficace de le faire. Où devrais-je sauvegarder les nouveaux champs?
2 solutions possibles sont à
1) Utilisez la table d’options Wordpress comme décrit ici ... Ajouter des champs personnalisés à des taxonomies personnalisées . Ceci est certes "pas propre" et supposé ne pas être la bonne réponse.
// 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) Ajoutez une nouvelle table comme décrit ici Taxonomies personnalisées dans Wordpress qui respecte la convention de dénomination "wp_" + customtaxonomykey + "meta".
3) Une autre option
L'option 2 est la méthode la plus propre - que j'ai également utilisée à plusieurs reprises. Malheureusement, il n'y a pas encore de table term_metadata par défaut dans WordPress. Cet article aborde également la même approche, http://shibashake.com/wordpress-theme/add-term-or-taxonomy-meta-data
Et bien sûr, il existe aussi un plugin pour cela :) http://wordpress.org/extend/plugins/taxonomy-metadata/
wp_options
par défautJe ne comprends vraiment pas pourquoi les gens proposent
update_option( "taxonomy_term_$t_id", $term_meta );
quand on peut avoir une seule option, dont les index sont l'ID de terme et les champs personnalisés comme valeurs
$options = get_option( 'taxonomy_term_meta' );
$options[$t_id] = $term_meta;
update_option( 'taxonomy_term_meta', $options );
puis tirez simplement sur l'option et obtenez la valeur stockée pour un ID de terme donné
$options = get_option( 'taxonomy_term_meta' );
echo $options[$tax->term_id];
wp_taxonomymeta
personnaliséeC'est ce que fait le plugin Taxonomy Metadata , lié par James. Et c'est très simple, une fois cette table créée, les fonctions add_
, get_
, update_
et delete_metadata
commenceront à fonctionner avec 'taxonomy'
. Ainsi:
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);
}
Comme décrit dans Matthew Boynes answer (je pense que quelqu'un le mentionne aussi dans le billet # 10142.
Dans le plugin code , il y a un lien vers le Core Ticket # 10142 qui discute de tout cela. C'est un ticket vieux de 4 ans, (closed)(maybelater)
, de nombreux développeurs sont intervenus, mais aucune conclusion n'a été atteinte.
À la fin, nous avons cette pépite (mon emphase):
Comme j’en ai besoin régulièrement, j’ai écrit ma propre solution: abuse du champ "description" en tant que conteneur de stockage pour un tableau sérialisé. La seule chose qui était un peu délicate était d'afficher la description en clair dans l'interface utilisateur d'administration. Quoi qu’il en soit, c’est la solution que j’espérais: Convertir simplement le champ de description au lieu d’ajouter de nouveaux champs. S'il en a besoin, nous verrons les cas d'utilisation une fois que nous l'aurons obtenu et nous passerons à une solution de recherche avec une version ultérieure.
Prettyintelligent.
La meilleure réponse est (3) Une autre option .
Ceci est un peu non conventionnel, mais il s'adapte le mieux, tire le meilleur parti du noyau et ne nécessite pas l'ajout d'une table de base de données: Ajoute un type de publication masqué pour la taxonomie. Chaque terme de la taxonomie reçoit son propre message dans le type de message. Avec cela en place, le terme méta peut être stocké comme post méta. Voici un exemple d'utilisation de cette approche .
Les principaux problèmes de toute autre approche (y compris l'option "utiliser le champ de description du terme pour conserver des données sérialisées") sont l'évolutivité, les performances et la compatibilité.
Vous pouvez enregistrer l'ID de pièce jointe dans la table d'options et pouvoir afficher cette pièce jointe
Il existe trois fonctions principales pour ajouter la méta-boîte à la taxonomie. Celles-ci sont invoquées via les hooks suivants:
Ici, vous pouvez modifier le nom taxonomy_name avec n'importe quelle taxonomie prédéfinie ou personnalisée en conséquence. J'utilise "Taxonomie des produits Woocommerce" et crée un plugin pour celui-ci.Veuillez réviser les fonctions suivantes pour ajouter un champ personnalisé:
{taxonomy_name} _add_form_fields ajoute un nouveau champ personnalisé pour ajouter un nouveau formulaire de page de mot.Voici, je crée un champ pour ajouter une classe à un terme.
Ajoutez le code suivant dans functions.php dans votre thème
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 ajoute un champ à la page d'édition du terme
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 );
https://wordpress.org/plugins/taxonomy-metadata/
Vous pouvez personnaliser via le plugin mentionné ci-dessus.