J'ai un crochet d'action qui fonctionne parfaitement pour le contenu. Je voudrais appliquer le même hook chaque fois qu'une poignée de champs custom_field est demandée.
Les champs personnalisés sont 1) myfieldone 2) myfieldart 3) myfieldestion Donc prenons simplement l'un de ceux-ci - "myfieldone" Y a-t-il un moyen - à tout moment, le champ personnalisé "myfieldone" est demandé, pour que je puisse filtrer la valeur (the_content) de THAT champ personnalisé?
Je suppose que ce serait aussi simple que
add_filter('myfieldone', 'my_add_a_class_function', 10,8);
//or
add_action('myfieldone', 'my_add_a_class_function');
Cependant, aucun de ceux-ci n'a d'effet.
J'ai également essayé de l'appliquer globalement à tous get_meta, get_meta_key
add_filter('get_meta', 'my_add_a_class_function', 10,8);
add_filter('get_meta_key', 'my_add_a_class_function', 10,8);
//no such luck. What am I missing?
Donc, je veux fondamentalement faire
$which_meta_key = 'myfieldone';
add_action($which_meta_key, 'my_add_a_class_function');
Voici comment je le fais avec the_content.
add_action('the_content', 'my_add_a_class_function');
function my_add_a_class_function($content){
$sample_html = $content;
// grab all the matches for img tags and exit if there aren't any
if(!preg_match_all('/<img.*\/>/i', $sample_html, $matches))
exit("Found no img tags that need fixing\n");
// check out all the image tags we found (stored in index 0)
//print_r($matches);
// iterate through the results and run replaces where needed
foreach($matches[0] as $string){
// keep this for later so that we can replace the original with the fixed one
$original_string = $string;
// preg_replace only replaces stuff when it matches a pattern so it's safe to
// just run even if it wont do anything.
$classes = 'TEST'; // separated by spaces, e.g. 'img image-link'
// check if there are already classes assigned to the anchor
if ( preg_match('/<img.*? class=".*?">/', $string) ) {
$string = preg_replace('/(<img.*? class=".*?)(".*?>)/', '$1 ' . $classes . '$2', $string);
} else {
$string = preg_replace('/(<img.*?)>/', '$1 class="' . $classes . '" >', $string);
}
// now replace the original occurence in the html with the fix
$sample_html = str_replace($original_string, $string, $sample_html);
}
return $sample_html;
}
UPDATE: L'appel de clé méta personnalisé ci-dessous semble bien fonctionner. Cependant, le message "{if/EXIT} qui se trouve n'a pas été corrigé"
... // pass the custom_meta content to my filter.
$sample_content = $content
print_r($sample_content);
//YIELDS
<p><img class="alignleft" width="175" height="175" src="/wp-content/uploads/2013/04/brother-in-law.gif" alt="">
Peter, My brother-in-law informed me that he has a new job at IBM.</p>
Cependant, avant d'appliquer le filtre, je vérifie qu'il existe des images à filtrer. et existe sinon. Apparemment, aucune image n'a été trouvée - bien que par print_r - - une étiquette d'image existe clairement.
if(!preg_match_all('/<img.*\/>/i', $sample_html, $matches))
exit("Found no img tags that need fixing\n");
// YIELDS:
Found no img tags that need fixing
//however it does echo out my custom field html code, the image and paragraph text display - - because thats part of the get_meta_data - where I initially request the custom field.
SO - QUESTION - S'agit-il d'un problème de regex simple? Est-ce que j'ai un regex mal formé pour mon
preg_match_all ('/<img.*\/>/i'...
OU - dois-je appliquer un filtre "to_string" au contenu pour qu'il trouve une image sous forme d'image plutôt que de texte
Je n'ai aucune expérience avec le filtre get_{$meta_type}_metadata
non plus. Par conséquent, tout ce que je peux offrir, c'est une approche supplémentaire d'une solution de contournement possible:
Iff vous n'avez pas besoin de satisfaire les tiers en utilisant get_post_meta
, mais souhaitez uniquement utiliser le filtre dans votre propre code, vous pouvez écrire un wrapper personnalisé pour get_post_meta
, qui acceptera à son tour un filtre:
function wpse94639_get_post_meta( $post_id, $key = '', $single = false ) {
$metadata = get_post_meta( $post_id, $key, $single );
return apply_filters( 'wpse94639', $metadata );
}
Vous pouvez maintenant utiliser add_filter( 'wpse94639', 'my_add_a_class_function' );
.
Ceci n'est qu'une solution viable et si vous n'avez pas besoin de filtrer les résultats lorsqu'un autre thème/plug-in utilise le get_post_meta
d'origine, évidemment.
Comment appliquer le même filtre à la valeur de la méta-clé?
Ce que vous essayez de faire - add_filter('myfieldone', 'my_add_a_class_function', 10,8);
-- - ne fonctionnera pas. Vous ne pouvez pas simplement créer un crochet. Ils doivent être implémentés quelque part dans la source avec apply_filters
ou do_action
.
Le moyen le plus simple est d'appeler la fonction.
$meta_value = get_post_meta($post_id,'key');
$meta_value = my_add_a_class_function($meta_value);
Autant que je sache, il n’existe pas de balise/hook de modèle comme the_content
à laquelle vous pouvez associer cette fonction.
Il existe un filtre sur get_metadata
, qui est utilisé par get_post_meta
et get_post_custom
(indirectement), qui est construit comme get_{$meta_type}_metadata
, mais honnêtement je peux Ne faites pas fonctionner ce filtre d’une manière qui ait du sens pour moi.
Quelque chose comme if (is_page_template ('enews_template.php') {// filtre tous les champs personnalisés générés dans ce modèle
Probablement pas. Les champs personnalisés ne sont pas "générés" dans un modèle et ne sont associés à aucun modèle en particulier, mais à posts/pages/CPT. Si vous réussissiez à faire fonctionner cela, ce serait compliqué et alambiqué - à moins que quelqu'un ne puisse faire fonctionner ce filtre get_{$meta_type}_metadata
, auquel j'ai malheureusement échoué.