C'est une question assez longue, si nue avec moi.
Dans un plug-in que j'ai écrit qui permet aux utilisateurs de créer facilement de nouvelles boîtes à méta, j'ai une fonction qui utilise un commutateur () pour renvoyer le code HTML approprié pour le type de champ de méta ajouté. La fonction ressemble à ceci:
// displays the requested field type
function ecpt_render_field($field, $meta) {
global $wp_version, $post, $ecpt_options;
switch($field['type']) :
case 'text' :
$field_html = '<input type="text" name="' . $field['id'] . '" id="' . $field['id'] . '" value="' . stripslashes($meta) . '" size="30" style="width:97%" /><br/>' . __(stripslashes($field['desc']));
break;
/*****************************************************************
* lots of case statements here have been removed for this example
******************************************************************/
case 'checkbox' :
$field_html = '<input type="checkbox" name="' . $field['id'] . '" id="' . $field['id'] . '" ' . checked(!empty($meta), true, false) .'/><div class="ecpt_description">' . __(stripslashes($field['desc'])) . '</div>';
break;
endswitch;
if(has_filter('ecpt_fields_html')) {
// this adds any addon fields (from plugins) to the array
$field_html = apply_filters('ecpt_fields_html', $field, $field_html, $meta);
}
// return the final field
return $field_html;
}
$ field est un tableau contenant toutes les informations pour le champ (id, type, classe, etc.). $ méta est la valeur stockée dans le post méta.
A la fin de la fonction, le filtre "ecpt_fields_html" est vérifié. Ceci est un filtre que j'ai configuré pour permettre à d'autres types de méta-champs d'être enregistrés via d'autres plugins.
Un exemple de fonction qui enregistre d'autres types de champs (avec succès) ressemble à ceci:
// generates the HTML for the additional fields
function ecpt_bonus_fields_html($field, $field_html, $meta) {
switch($field['type']) :
case 'taxonomy' :
// returns the options html for select fields
$field_options = ecpt_get_field_options($field, $meta);
$field_html = '<select name="' . $field['id'] . '" id="' . $field['id'] . '">' . $field_options . '</select><br/>' . $field['desc'];
break;
case 'separator' :
$field_html = '<hr/>';
break;
case 'colorpicker' :
if (empty($meta)) $meta = '#';
$field_html = "<input class='ecpt-color' type='text' name='" . $field['id'] . "' id='" . $field['id'] . "' value='" . $meta . "' size='8' />
<a href='#' class='ecpt-color-select' rel='" . $field['id'] . "'>" . __('Select a color') . "</a>
<a href='#' class='ecpt-color-select' style='display: none;'>" . __('Hide Picker') . "</a>
<div style='display:none; position: absolute; background: #f0f0f0; border: 1px solid #ccc; z-index: 100;' class='ecpt-color-picker' rel='" . $field['id'] . "'></div>";
break;
default :
$field_html = $field_html;
endswitch;
return $field_html;
}
add_filter('ecpt_fields_html', 'ecpt_bonus_fields_html', 10, 3);
Cette fonction pour enregistrer des types de champs supplémentaires fonctionne exactement comme le premier.
Supposons maintenant que la fonction ci-dessus soit activée dans un plug-in complémentaire (tout fonctionne correctement), puis que je mette en place un second plug-in comportant une seconde fonction qui enregistre plus de types de champs (cette nouvelle seconde fonction est structurée exactement comme la fonction de filtrage ci-dessus). Si je le fais, les deux fonctions de filtre qui enregistrent de nouveaux types de champs échouent complètement. Ils ne génèrent aucune erreur, mais le "return $ field_html;" déclaration ne retourne simplement rien du tout.
La deuxième fonction de filtrage ressemble à ceci:
// generates the HTML for the additional fields
function ecpt_sample_fields_html($field, $field_html, $meta) {
switch($field['type']) :
case 'textblock' :
$field_html = 'this should be shown in the metabox, but is not';
break;
endswitch;
return $field_html;
}
add_filter('ecpt_fields_html', 'ecpt_sample_fields_html', 10, 3);
Les deux fonctions de filtre fonctionnent parfaitement lorsque l’autre n’est pas active, mais si elles sont toutes les deux actives, alors le $ field_html = apply_filters ('ecpt_fields_html', $ field, $ field_html, $ meta); dans la toute première fonction ne donne rien, juste vide.
Bon, c'est là que ça devient un petit inconnu. J'ai un ensemble de fonctions/filtres presque identique qui affiche les libellés des types de champs dans la boîte méta. Ils fonctionnent parfaitement bien.
Dans le plugin principal, la fonction qui configure l’étiquette pour chaque champ ressemble à ceci:
// run the label through a filter. This allows us to modify/remove the label for any field type
function ecpt_field_label($field) {
$label = '<label for="' . $field['id'] . '">' . __(stripslashes($field['name'])) . '</label>';
// the ecpt_field_label_filter allows the field label output to be altered for any field type
if(has_filter('ecpt_field_label_filter')) {
$label = apply_filters('ecpt_field_label_filter', $label, $field);
}
return $label;
}
Et la fonction de filtrage qui permet de modifier l’étiquette HTML pour les champs enregistrés avec d’autres plugins se présente comme suit:
// modify the labels for the bonus fields (if needed)
function ecpt_bonus_fields_labels($label, $field) {
if($field['type'] == 'separator') {
// removes the label for the separator field
return;
}
if($field['type'] == 'header') {
return '<h4>' . $label . '</h4>';
}
return $label;
}
add_filter('ecpt_field_label_filter', 'ecpt_bonus_fields_labels', 10, 2);
Cela fonctionne parfaitement, même lorsque je configure une seconde fonction de filtrage d’étiquettes (rappelez-vous que la configuration de la deuxième fonction pour les types de champ a été la cause de sa rupture). Donc, ma deuxième fonction de filtrage pour les étiquettes ressemble à ceci:
// modify the labels for the bonus fields (if needed)
function ecpt_sample_field_labels($label, $field) {
if($field['type'] == 'textblock') {
return '<strong>' . $label . '</strong>';
}
return $label;
}
add_filter('ecpt_field_label_filter', 'ecpt_sample_field_labels', 10, 2);
La différence seulement (à part l'utilisation des instructions switch () et i()) est que le filtre des types de filtre a 3 paramètres et le filtre des étiquettes de champ moins c'est la seule différence que je peux trouver.
Vous trouverez ci-dessous des captures d'écran illustrant le problème.
apply_filters
nécessite le