WP_Query en functions.php
Tengo un código que quiero convertir en una función. Funciona perfectamente hasta que lo envuelvo en dicha función:
$args = array(
'posts_per_page' => -1,
'post_type' => 'asset',
'category_name' => $cat
);
$cat_query = new WP_Query( $args );
$matching_category_ids = array();
while ( $cat_query->have_posts() ) : $cat_query->the_post();
array_push($matching_category_ids, $post->ID);
endwhile;
La función se ve algo así:
function grab_ids_in_category($cat) {
// contenido de arriba aquí
return $matching_category_ids;
}
¿Qué estoy haciendo mal?
Es simple, estás accediendo a $post
fuera de contexto.
Cuando ejecutas un bucle estándar de WordPress, WP carga una variable global $post
con los resultados de la consulta actual. Esto incluye el ID, título, contenido, metadatos, etc. Las funciones del bucle hacen referencia a esta variable global para proporcionarte los datos.
Tomemos como ejemplo la función regular get_the_ID()
:
function get_the_ID() {
global $post;
return $post->ID;
}
Tu código funcionará bien fuera de una función porque, en algún lugar del código anterior, probablemente estás declarando como global
la variable $post
. Por eso tu referencia directa a $post->ID
funciona.
Pero cuando envuelves este código dentro de una función, no estás haciendo referencia a $post
como global, por lo que $post->ID
no devolverá nada porque la variable local $post
no está definida.
En lugar de referenciar directamente $post->ID
, usa la función estándar del bucle get_the_ID()
:
while ( $cat_query->have_posts() ) : $cat_query->the_post();
array_post( $matching_category_ids, get_the_ID() );
endwhile;

Debes agregar la variable global $post dentro de la función de esta manera:
function grab_ids_in_category($cat) {
global $post;
$args = array(
'posts_per_page' => -1,
'post_type' => 'asset',
'category_name' => $cat
);
$cat_query = new WP_Query( $args );
$matching_category_ids = array();
while ( $cat_query->have_posts() ) : $cat_query->the_post();
array_push($matching_category_ids, $post->ID);
endwhile;
return $matching_category_ids;
}
// imprime la Query y pasa un nombre de categoría
echo grab_ids_in_category('nombre_de_categoria');
