Contenu principal
Yeah I'm Single

WordPress, is_single() améliorée : is_single_page()

Salut.

Je viens de me faire un conditional tag qui pourrait être utile.
J’avais besoin d’une sorte de is_single() qui fonctionne pour n’importe quel type de post, c’est ce que fait ma fonction.

On a is_singular() mais la vérification ne se fait qu’au niveau du type de post, or je souhaite faire la vérification au niveau de l’ID du post, c’est ce que que fait is_single(). Mais is_single() fonctionne pour tous les types de post sauf les pages et les médias. Il suffirait donc de faire is_single($ID) || is_page($ID) || is_attachment($ID), sauf que is_attachment() ne prend pas d’argument, c’est balo.

J’ai donc repris le code de ces trois fonctions, ai délicatement mélangé le tout, et tadaaa !

0102030405060708091011121314151617181920212223242526272829303132333435

if ( !function_exists('is_single_page') ):
function is_single_page( $post = '' ) {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1' );
		return false;
	}

	if ( !$wp_query->is_single && !$wp_query->is_page && !$wp_query->is_attachment )
		return false;

	if ( empty($post) )
		return true;

	$post_obj = $wp_query->get_queried_object();

	if ( is_a($post, 'WP_Post') ) {
		if ( empty($post->ID) )
			return false;
		$post = $post->ID;
	}

	$post = (array) $post;

	if ( in_array( $post_obj->ID, $post ) )
		return true;
	elseif ( in_array( $post_obj->post_title, $post ) )
		return true;
	elseif ( in_array( $post_obj->post_name, $post ) )
		return true;

	return false;
}
endif;

Et voilà un is_single() qui marchera avec n’importe quel type de post.
Ici, l’argument $post fonctionnera de la même manière que pour is_single(), c’est à dire que ça peut être un ID, un slug (post_name), un titre, ou un tableau de plusieurs IDs/slugs/titres. Petit bonus, $post peut également être un objet WP_Post (le test se fera alors sur l’ID).

See ya!