web-dev-qa-db-fra.com

Remplacement de wp_get_archives () apply_filters ()

J'ai googlé pendant un moment et je ne sais pas quelle est la meilleure façon de procéder.

Dans wp-includes/general-template.php je regarde la fonction wp_get_archives() qui a cette ligne de code dans:

$where = apply_filters( 'getarchives_where', "WHERE post_type = 'post' AND post_status = 'publish'", $r );

Ce que je veux faire, c'est avoir:

$where = apply_filters( 'getarchives_where', "WHERE post_type = 'post' OR post_type = 'events' AND post_status = 'publish'", $r );

Cependant, je ne suis pas sûr de savoir comment brancher ce filtre et le remplacer dans functions.php

Tout conseil apprécié.

Merci,

Ian

2
Ian Jamieson

Un filtre WordPress est une fonction qui prend une chaîne, un tableau ou un objet, y fait quelque chose et renvoie le filtréchaîne, tableau ou objet).

Donc, ce que vous voulez faire est de transformer "WHERE post_type = 'post' AND post_status = 'publish'" en "WHERE post_type = 'post' OR post_type = 'events' AND post_status = 'publish'". C'est assez simple.

En apparence, le filtre getarchives_where accepte deux arguments. Donc, vous allez accrocher le filtre comme suit:

add_filter( 'getarchives_where', 'my_fancy_filter_function', 10, 2 );

Ensuite, vous devez écrire une fonction qui prend deux paramètres, les filtre et retourne une chaîne:

function my_fancy_filter_function( $text, $r ) {
    return "WHERE post_type = 'post' OR post_type = 'events' AND post_status = 'publish'";
}

Maintenant, cette fonction prendra n'importe quelle entrée, mais toujoursrenverra la chaîne du filtre que vous avez spécifié. Il existe des méthodes beaucoup plus avancées pour ajouter des paramètres de requête, mais cela accomplira exactement ce que votre question demande.

4
EAMann

Dans un plugin ou dans le functions.php de votre thème, écrivez simplement:

add_filter( 'getarchives_where', 'wpse_67264_filter_getarchives_where' );

/**
 * Add post type 'events' to wp_get_archives() query.
 * 
 * No parameters needed because we ignore them anyway.
 * 
 * @wp-hook getarchives_where
 * @return  string New WHERE clause
 */
function wpse_67264_filter_getarchives_where()
{
    return "WHERE post_type = 'post' OR post_type = 'events' AND post_status = 'publish'";
}

C’est mieux qu’un code WP_Query personnalisé, à mon avis, et vous n’avez même pas besoin d’accepter de paramètre dans votre rappel car vous n’utilisez pas de thème. :)

Pour comprendre le fonctionnement des filtres, lisez le Codex sur l’API du plugin . Fondamentalement, votre valeur de retour de rappel remplacera la deuxième partie dans apply_filters().

2
fuxia

Ce que vous voudrez réellement faire est d’utiliser la classe intégrée WordPress appelée WP_Query. De cette façon, vous ne modifierez pas les fonctionnalités de base de WordPress (ce qui vous donnerait de gros maux de tête au moment de la mise à niveau).

Dans votre page d'archives, remplacez votre boucle actuelle par une requête personnalisée comme ceci:

$args = array(); // setup the custom posts you want in here
$custom_query = new WP_Query($args); // build a custom query
while($custom_query->have_posts()) : $custom_query->the_post();
    // inside the loop, show your posts
endwhile;
wp_reset_postdata(); // reset the query

Le tableau $args est simplement votre logique personnalisée des publications qui doivent apparaître dans cette boucle. Voir la Documentation WP_Query pour une liste complète des choses que vous pouvez mettre dans ce tableau.

Par exemple, vous voulez filtrer sur le type de publication, donc voir cette section du document et vous remarquerez que vous pouvez construire votre tableau $args comme suit:

$args = array('post_type' => array('post', 'events'))

J'espère que cela pourra aider!

[edit]

Je viens de me rendre compte que vous souhaitiez peut-être obtenir une simple liste non ordonnée de publications dans les archives (et ne pas nécessairement afficher les publications elles-mêmes, car c'est ainsi que wp_get_archives se comporte).

Créez simplement votre propre liste non ordonnée en encapsulant la boucle dans une balise <ul>, puis à l'intérieur de la sortie de la boucle balises <li> autour de le titre du message archivé et du lien permanent vers le message archivé.

1
Jared Cobb