Utilizzo di WP_Query in functions.php
Ho del codice che voglio trasformare in una funzione. Funziona perfettamente finché non lo inserisco nella funzione:
$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 funzione appare più o meno così:
function grab_ids_in_category($cat) {
//codice di cui sopra qui
return $matching_category_ids;
}
Cosa sto sbagliando?
Semplice, stai facendo riferimento a $post
fuori dal contesto.
Quando esegui un loop standard di WordPress, WP caricherà una variabile globale $post
con i risultati della query corrente. Questo include l'ID, il titolo, il contenuto, i meta dei post, ecc. Le funzioni del loop faranno riferimento a questa variabile globale per fornirti i dati.
Prendiamo ad esempio la funzione regolare get_the_ID()
:
function get_the_ID() {
global $post;
return $post->ID;
}
Il tuo codice funzionerà bene al di fuori di una funzione perché, da qualche parte nel codice sopra, probabilmente stai rendendo globale la variabile $post
. Quindi il tuo riferimento diretto a $post->ID
funziona.
Ma quando racchiudi questo codice all'interno di una funzione, non stai facendo riferimento a $post
come globale, quindi $post->ID
non restituirà nulla perché la variabile locale $post
non è definita.
Invece di fare riferimento direttamente a $post->ID
, usa la normale funzione del loop get_the_ID()
:
while ( $cat_query->have_posts() ) : $cat_query->the_post();
array_post( $matching_category_ids, get_the_ID() );
endwhile;

Devi aggiungere la variabile globale $post all'interno della funzione in questo modo:
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;
}
// mostra la Query e passa il nome di una categoria
echo grab_ids_in_category('nome_categoria');
