Que font add_filters () et apply_filter ()?

Je ne sais pas trop pourquoi cela ne fonctionne pas – même sil faut dire que je ne sais pas trop quoi apply_filters() et add_filter le font, donc des conseils généraux seraient également très bien!

Je veux une requête qui renvoie les cinq articles précédents sur une seule page de message. Jenvoie la date de la publication actuelle et je souhaite appliquer un filtre qui filtre les publications antérieures.

function sw_filter_posts_before( $where = "", $date) { $where .= " AND post_date < "" . $date . """; return $where; } 

Comment est-ce que je lapplique correctement? Utiliser simplement add_filter ou apply_filter avant dinstancier un nouvel objet WP_Query ne semble pas fonctionner correctement.

Merci davance!

Edit: Pour aller plus loin, jaimerais comprendre comment passer une variable dans le filtre, car je ne peux pas faire passer $ date à partir dune autre fonction.

Voici une autre fonction (cest un appel ajax dans wordpress, donc je commence par obtenir le ID de publication de la page actuelle via une variable $ _POST):

function create_more_videos_sidebar() { $id = $_POST["theID"]; $args = array( "post_type" => "videos", "posts_per_page" => 1, "p" => $id ); $wp_query = new WP_Query($args); while ($wp_query->have_posts()) : $wp_query->the_post(); $do_not_duplicate = $post->ID; $date = get_the_date("Y-m-d"); endwhile; $args = array( "post_type" => "videos", "posts_per_page" => 5 ); add_filter( "posts_where", "sw_filter_videos_before" ); //don"t know how to pass $date $wp_query = new WP_Query($args); remove_filter( "posts_where", "sw_filter_videos_before" ); //do loop stuff $response = json_encode( array( "result" => $result ) ); header( "Content-Type: application/json" ); echo $response; exit; } 

Commentaires

  • Daccord, premières choses, dabord: à quel crochet, exactement, essayez-vous dajouter votre filtre? Cela compte, car votre variable $date utilise des données $post, nous devons donc savoir si nous ' re filtrer à lintérieur ou à lextérieur de la boucle.
  • Je pense que cest peut-être là que mon manque de connaissance des filtres wp me frappe. Je pensais que le crochet était ' posts_where ', et il ajouterait la chaîne donnée à la requête SQL. Pour autant que je ' je sache que ' est en dehors de la boucle, car ' s dans la partie prétraitement de la création dune boucle. Avez-vous une suggestion sur la manière dont jatteindrais mon objectif avec les meilleures pratiques?
  • Bien sûr, nous pouvons y arriver. 🙂 Quelle date souhaitez-vous utiliser? Question plus précise: comment voulez-vous déterminer quelle date utiliser?

Réponse

Que tentez-vous de filtrer? Je suppose que vous essayez dajouter un filtre à un crochet de filtre appelé posts_before. Dans ce cas, vous devez ajouter votre filtre à ce hook, via add_filter():

function mytheme_filter_posts_before( $where = "", $date) { $where .= " AND post_date < "" . $date . """; return $where; } // Add function to the filter hook add_filter( "posts_before", "mytheme_filter_posts_before" ); 

Notez que jai changé le nom de votre fonction. filter_posts_before() est beaucoup trop générique dun nom de fonction, et très susceptible de provoquer une collision de nom de fonction.

EDIT

Et juste pour clarifier:

  • apply_filters() est l emplacement du crochet de filtre , est appelé par le code principal et est utilisé pour appliquez tous les filtres ajoutés à la file dattente par Thèmes / Plugins ( et noyau).
  • add_filter() est appelé par Thèmes / Plugins (et core), et est utilisé pour ajouter des filtres à la file dattente à appliquer au hook par core.

EDIT 2

Daprès votre commentaire ci-dessus, le hook est posts_where. Alors, essayons de reconstruire votre fonction de rappel:

function mytheme_filter_posts_where( $where ) { // Here, we need to figure out how to // determine what date to use. In your // code example, you call get_the_date(), // but this function must be used inside // the Loop. Let"s try get_the_time() // instead. You"ll just need to come up // with a way to determine what post ID to use. $post = "some_post_id"; $date = get_the_time( "Y-m-d", $post ); $where .= " AND post_date < "" . $date . """; return $where; } // Add function to the filter hook add_filter( "posts_where", "mytheme_filter_posts_where" ); 

Commentaires

  • Merci pour la clarification! Je ' massurerai de renommer le filtre. Je ne ' pas comprendre comment passer la date $ Pourriez-vous clarifier cela aussi? Merci!
  • Quest-ce que la variable $date et doù vient-elle?
  • $ date provient dune autre de mes fonctions, cest la date de la publication actuelle, au format ' Ymd '.
  • Êtes-vous en train de globaliser $date, ou de le renvoyer à partir de la fonction, quoi? Pouvez-vous publier le code de cette fonction ' , aussi?
  • Okey-cokey, jai ' mis à jour le message dorigine avec quelques détails supplémentaires. Je pourrais globaliser la date, mais est-ce entièrement nécessaire? Est-ce pas mieux, si possible, de simplement le passer dune manière ou dune autre?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *