web-dev-qa-db-fra.com

get_posts () ne fonctionne pas dans functions.php

Si j'utilise la fonction suivante dans n'importe quel modèle de thème, cela fonctionne comme prévu. Cependant, lorsque j'essaie de l'utiliser dans une fonction AJAX dans le fichier functions.php, il renvoie vide.

$args = array (
        'numberposts' => 10,
        'post_type' => array('topic','reply'),
        'author' => 454
    );
$user_posts = get_posts($args);

Des idées?

Voici la fonction complète:

function he_delete_user(){

    $args = array (
        'numberposts' => 10,
        'post_type' => array('topic','reply'),
        'author' => 454
    );
    $user_posts = get_posts($args);

    if (empty($user_posts)){
        $response_array['status'] = 'false';    
        echo json_encode($response_array);
    }
    else{
        // delete all the user posts
        foreach ($user_posts as $user_post) {
            wp_delete_post($user_post->ID, true);
        }
        $response_array['status'] = 'success';    
        echo json_encode($response_array);
    }
}
add_action('wp_ajax_he_delete_user','he_delete_user');
1
jetlej

Ceci est un pansement, pas une solution. Mais il semble qu'il y ait un bogue dans WP_Query. J'ai donc dû modifier la requête avant son exécution afin que le paramètre post_type ne soit pas ignoré.

1) J'ai changé get_posts () en WP_Query

2) J'ai ajouté ceci à mon fichier functions.php:

function ban_parse_wp_query( $query ) {
    $query->set( 'post_type', array('topic','reply') );
    return $query;
}

3) Ensuite, j'ai modifié la requête avec cette action juste avant son exécution, puis je l'ai supprimée juste après afin que cela n'affecte pas les autres requêtes:

add_filter( 'pre_get_posts', 'ban_parse_wp_query' );
$user_posts = new WP_Query($args);
remove_filter( 'pre_get_posts', 'ban_parse_wp_query' );
0
jetlej