web-dev-qa-db-fra.com

fonction globale pour appliquer le filtre à un champ personnalisé

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

1
Acts7Seven

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.

1
Johannes Pille

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é.

0
s_ha_dum