3 Möglichkeiten für in_category außerhalb des Loops

WordPress Funktionen
WordPress Funktionen

Ich wurde gefragt wie man in_category auch außerhalb des Loops nutzen kann. Meist braucht man dies in der Sidebar oder man mag ganz spezielle meta tags im html Header anzeigen. Oder man mag im Footer, also den sichtbaren Footer einer Website, was spezielles anzeigen. Oder man braucht dies für eine ganz spezielle Navigation. Oder… ?

Ich nutze dafür drei Möglichkeiten:

in_category mit query post außerhalb des Loops nutzen

<?php
 $post = $wp_query->post;
 if ( in_category('29') ) {  ?>
<h3>wenn ich category 20 zeige dies</h3>

<?php elseif ( in_category( array( 'Wir sind die Besten', 'kleine-funktionen' ) )) { ?>
<h3>Wenn in  Wir sind die Besten oder in der Cat kleine-funktionen liest du dieses</h3>
<?php } else {  ?>
<h3>Sonst zeige jenes</h3>
<?php }?>

Dies hat den Vorteil es geht schnell und man muss sich nur die ID der Category, den Namen oder den Slug der Kategorien holen.
Es hat den Nachteil, dass es relativ viel Code ist für so manches Projekt ist, weil diese Funktion beinhart ist: sie nimmt nur die angegebenen Kategorien, also „wirkt“ nicht automatisch auch bei Unterkategorien.

in_category bei komplexen Projekten mit WordPress

zb Auf der Domain gesund.co.at gibt es mehrere Hauptkategorien und jede Menge an Unterkategorien. Werbung soll in Abhängigkeit zur jeweiligen Hauptkategorie und ihrer Unterkategorien dargestellt werden und zwar auch in der Einzelansicht der jeweiligen Artikel.

Dies ist ein klassischer Fall für „in_category„. Aber sehr oft wird dies außerhalb jedweden Loops gebraucht und ich wollte mir die Übersicht in den Templates bewahren,und nicht bei jeder Nutzung von in_category elends Listen der Unterkategorien anführen müssen. ;)

So suchte ich nach Lösungen und fand diese in der Funktion in_category_extend bei Charlie Evans.

in_category_extend

Diese Funktion kommt in die functions.php.

//credits to charlie evans
function in_category_extended($category) {
 
	// easy out
	if (!(is_category() or is_single())) return false;
 
	// retrieve specified category (ID or slug)
	$obj_specified_category = is_numeric($category) ? get_category($category) : get_category_by_slug($category);
	if (empty($obj_specified_category->cat_ID)) return false;
 
	// we're viewing a category
	if (is_category()) {
		$current_category_ID = get_query_var('cat');
		return ($obj_specified_category->cat_ID == $current_category_ID or cat_is_ancestor_of($obj_specified_category->cat_ID,$current_category_ID));
	}
 
	// we're viewing a post
	else {
		global $wp_query;
		$obj_post = $wp_query->get_queried_object();
		if (empty($obj_post->ID)) return false; 
 
		if (in_category($obj_specified_category->cat_ID, $obj_post->ID)) return true;
		else return in_category(get_term_children($obj_specified_category->cat_ID, 'category'), $obj_post->ID);
	}
}

Diese Funktion erweitert in_category derart, dass es auch die Unterkategorien miteinbezieht.

in_category_extend im Template

 <?php if (in_category_extended('fitness-beauty'){  
echo'<p>Deine Angaben......</p>';
 } ?>

Damit war es aber bei dem Projekt gesund.co.at nicht getan. Manches sollte zwar in Abhängigkeit zu einer Hauptkategorie angezeigt werden, aber nicht in jeder Unterkategorie dieser Hauptkategorie. Da wirds mit query post und category_not_in auch irgendwann ziemlich kompliziert. Vor allem, weil dies innerhalb etlicher category.php und single.php zu tun wäre.

is_in_category war dafür die Lösung.

Dies kommt in die functions.php.

function is_in_category( )
{
        if( func_num_args() > 0 )
        {
                foreach( func_get_args() as $category )
                {
                        if( in_category( $category ) )
                        {
                                return( true );
                        }
                }
        }
        return( false );
}

Hier wird quasi in_category mit einer Variable bestückt. Sinnvoll ist es dieser Variable einen für die jeweilige Funktion sinnvollen Namen zu geben. Im array der Variable werden die IDs der Kategorien in aufsteigender Reihenfolge angeführt.

Somit kommen in die functions.php gleich unterhalb der Funktion is_in_category die Variablen mit den IDs.

Beispiel- die IDs sind Fantasieziffern ;)

$fitness = array (4,6,7,8,9,12345);

is_in_category im Template

 <?php if (is_in_category('$fitness'){  
echo'<p>Deine Angaben......</p>';
 } ?>

Gibt es nun eine Änderung, also sollte auf einmal doch noch die Kategorie „ichbinneu“ dazukommen und „ichbinalt“ rausgenommen werden, muss man diese Änderung nur in der functions.php machen.

Dies bringt eine sehr große Zeitersparnis, guten Überblick und eine Reduktion der Fehler mit sich. Man könnt ja bei einer Änderung irgendwo einen Aufruf vergessen. ;)

bei dem Projekt gesund.co.at brauchte ich deren viele => ;-)