Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/08/2013, 12:31
Avatar de zanguanga
zanguanga
Moderadora
 
Fecha de Ingreso: julio-2009
Ubicación: España
Mensajes: 1.686
Antigüedad: 15 años, 4 meses
Puntos: 429
in_category fuera del Loop (en sidebar)

Hola a todos, a ver si me podeis ayudar:

Necesito meter publi distinta en la barra lateral de los posts según categoría. Al estar fuera del Loop no me funciona el uso normal de in_category
He probado varias cosas y ninguna me funciona. Añadir que el tema lleva varias opciones de sidebars y widgets y estoy trabajando en un child-theme

En functions.php he copiado esta función del codex:

Código PHP:
Ver original
  1. /**
  2.  * Tests if any of a post's assigned categories are descendants of target categories
  3.  *
  4.  * @param int|array $cats The target categories. Integer ID or array of integer IDs
  5.  * @param int|object $_post The post. Omit to test the current post in the Loop or main query
  6.  * @return bool True if at least 1 of the post's categories is a descendant of any of the target categories
  7.  * @see get_term_by() You can get a category by name or slug, then pass ID to this function
  8.  * @uses get_term_children() Passes $cats
  9.  * @uses in_category() Passes $_post (can be empty)
  10.  * @version 2.7
  11.  * @link http://codex.wordpress.org/Function_Reference/in_category#Testing_if_a_post_is_in_a_descendant_category
  12.  */
  13. if ( ! function_exists( 'post_is_in_descendant_category' ) ) {
  14.     function post_is_in_descendant_category( $cats, $_post = null ) {
  15.         foreach ( (array) $cats as $cat ) {
  16.             // get_term_children() accepts integer ID only
  17.             $descendants = get_term_children( (int) $cat, 'category' );
  18.             if ( $descendants && in_category( $descendants, $_post ) )
  19.                 return true;
  20.         }
  21.         return false;
  22.     }
  23. }
  24.  
  25. ?>

Y en el widget (donde puedo escribir PHP) lo siguiente:

Código PHP:
Ver original
  1. <?php if (in_category( 'Textil' ) || post_is_in_descendant_category( 6 ) ) {
  2.       echo 'aqui anuncio solo textil en texto';
  3. }
  4. ?>

Lo que obtengo de esta forma es el anuncio en la página de categoría "Textil" pero no en los posts de esa categoría.

Es decir obtengo exactamente lo mismo que se obtiene usando if (is_category( 'textil' )) sin necesidad de crear ninguna función extra en functions.php

Sé que modificando el tema desde cero podría reorganizar tranquilamente todas las sidebars y meter el condicional en la plantilla single.php sin el menor problema, pero no es el caso, en principio preferiría adaptarme a lo que hay porque es una plantilla compleja y va preparada para muchas diferentes vistas de páginas y categorías, con un montón de widgets y funciones y varias sidebars por vista.

¿Alguien sabría decirme qué es lo que falla en ese código o si conoce alguna forma más simple de conseguir lo que busco?
También es posible que me haya atascado en alguna tontería, ya que con estos calores y el tiempo que llevo probando alternativas se me hayan derretido las neuronas
__________________
Mi blog personal | Mi G+