wp_future_posts v1.1

Mardi, 21 décembre, 2010 | wordpress

Je vous ai présenté récemment un plugin pour afficher les articles futurs sur votre site wordpress. Comme souvent, même si le plugin répond à notre exigence première, il ne répond pas totalement aux besoins que l’on attend de lui. Dans notre cas, Jérôme attend des articles qu’ils perdurent pendant 2 jours sur l’affichage, se qui n’est pas possible avec notre plugin actuel. Pour se faire, on va modifier une nouvelle fois la clause where de notre requête :

$where .= " AND ". $wpdb->prefix."posts.post_date >='".date("Y-m-d", time()-(2*24*60*60))."' OR ". $wpdb->prefix."posts.post_status='future'";

Comme vous pouvez le voir on joue avec la fonction php date. Cette fonction prend en premier paramètre le format dans lequel la date sera afficher. Le deuxième paramètre qu’elle prend en argument, est la date qu’il faut afficher. Bien évidemment, si vous ne lui passez pas de deuxième argument, elle prendra par défaut la date actuelle. On affiche donc les articles dont la date de publication est supérieure ou égale à avant hier ou alors ceux qui sont programmés dans le futur.

Un autre besoin évoqué, est de pouvoir afficher les articles par catégorie, une catégorie après l’autre. D’après mes recherches, peu de ressources disponibles sur internet traitent de ce sujet en particulier, puisque la plupart du temps, les gens se limitent à filtrer les catégories à afficher. Dans notre cas, il va nous falloir modifier une fois encore notre requête afin de pouvoir trier nos articles par catégorie. Par contre, les curieux qui ont déjà regarder les tables générées par wordpress ont pu se rendre compte que les articles ne possèdent pas directement de lien vers les catégories. Donc impossible de trier directement nos articles, il va donc falloir passer par des jointures.

Pour faire une jointure, on va agir de la même façon que pour modifier la clause where de notre requête. On commence alors par écrire une fonction qui fera la jointure :

function cgg_filter_post_join( $inner = '' 	){

	global $wpdb, $wp_query;

	if(!$wp_query->is_admin){

		$inner .= " INNER JOIN ".$wpdb->prefix."term_relationships ON (".$wpdb->prefix."posts.ID = ".$wpdb->prefix."term_relationships.object_id)";

		$inner .= " INNER JOIN ".$wpdb->prefix."term_taxonomy ON (".$wpdb->prefix."term_relationships.term_taxonomy_id = ".$wpdb->prefix."term_taxonomy.term_taxonomy_id)";

	}

	return $inner;
}

Pour lier cette fonction à la requête effectuée par wordpress, on va utiliser un filtre sur un des hooks liés aux articles. Celui qui nous intéresse ici est « posts_join ».

add_filter('posts_join', 'cgg_filter_post_join');

La jointure est opérationnelle. Elle vous semble sans doute compliquée, mais il faut savoir que dans wordpress, les catégories sont traitées comme les tags ou les champs personnalisés. Se sont en fait des termes stockés dans la table term. C’est dans la table term_taxonomy que nous spécifions si un terme est une catégorie, tag, lien … Et finalement, la table term_relationships relie les posts aux précédentes taxonomies. C’est cette table qui permet de dire qu’un article fait partie de telle ou telle catégorie. On a maintenant toutes les informations dont nous avons besoin. Il nous reste cependant à préciser l’ordre dans lequel afficher les articles, c’est à dire par catégorie.
Pour se faire, on va modifier le orderby de la requête pour y inclure les catégories.

function cgg_filter_post_order( $order = '' ){

	global $wpdb, $wp_query;

	if(!$wp_query->is_admin){
		$order = $wpdb->prefix."term_taxonomy.term_taxonomy_id DESC, ".$wpdb->prefix."posts.post_date DESC";
	}

	return $order;
}

Et on applique notre fonction avec un filtre sur le hook posts_orderby

add_filter('posts_orderby', 'cgg_filter_post_order');

Voilà, si vous appliquez le filtre, il va afficher les articles (futurs et datant de maximum 2 jours) par catégorie, dans l’ordre chronologique décroissant (du plus récent au plus ancien). il est intéressant de noter que pour ceux qui veulent réaliser la même chose avec moins de code, il est possible de définir la requête en une seule fois en appliquant un filtre sur le hook posts_request :

function cgg_filter_request( $request = '' ){

	global $wpdb, $wp_query;

	if(!$wp_query->is_admin && !$wp_query->is_archive){

		$request = "SELECT p.* FROM ".$wpdb->prefix."posts AS p
			INNER JOIN ".$wpdb->prefix."term_relationships AS rel ON (p.ID = rel.object_id)
			INNER JOIN ".$wpdb->prefix."term_taxonomy t ON (rel.term_taxonomy_id = t.term_taxonomy_id)

		WHERE t.taxonomy = 'category' AND p.post_type='post' AND (p.post_date>='".date("Y-m-d", time()-(2*24*60*60))."' OR p.post_status='future')

		ORDER BY t.term_taxonomy_id DESC, p.post_date DESC";

	}

	return $request;
}

add_filter('posts_request', 'cgg_filter_request');

Désormais que les articles sont rangés par catégorie, on peut imaginer affecter un style particulier au titre de chaque article en fonction de sa catégorie. Pour se faire, on encadre le titre de chaque article d’un span avec le slug de sa catégorie comme valeur pour la propriété class. (le slug est le nom de la catégorie transformer afin qu’il soit utilisable dans les url)

function cgg_filter_post_title($text =''){

	global $wpdb, $wp_query;

	$category = get_the_category(); 

	if(!$wp_query->is_admin)
		return "<span class=".$category[0]->category_nicename.">".$text."</span>";
	else
		return $text;

}

add_filter('the_title', 'cgg_filter_post_title');

Reste plus qu’à modifier l’affichage avec un css. Vous pouvez le spécifier vous même dans le css de votre thème ou l’intégrer dans votre plugin ainsi :

// remplacez les slug_category par ceux de vos propres catégorie
function cgg_css() {
	echo "
	<style type='text/css'>
		.slug_category-1{
			...
		}
		.slug_category-2{
			...
		}
		...
		...
		...
	</style>
	";
}

add_action( 'wp_head', 'cgg_css' );

Le plugin est opérationnel et est applicable tel quel. N’hésitez pas à me faire des retours si vous rencontrez des problèmes. Pour le téléchargement, il est comme d’habitude juste en dessous!

Download

Téléchargez le plugin

Tags: , ,

Aucun commentaire

Laisser un commentaire

Ma blogoliste

Archives

2011 01 02 03 04 05 06 07 08 09 10 11 12
2010 01 02 03 04 05 06 07 08 09 10 11 12
2009 01 02 03 04 05 06 07 08 09 10 11 12