web-dev-qa-db-ja.com

get_posts()がfunctions.phpで機能しない

どのテーマテンプレートでも次の機能を使用すると、期待どおりに機能します。しかし、私のfunctions.phpの中のAJAX関数内でそれを使用しようとすると、空を返します。

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

何か案は?

これが全機能です。

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

これは絆創膏であり、修正ではありません。しかし、それはWP_Queryにバグがあるように思われるので、post_typeパラメータが無視されないようにするために、実際に実行される直前にクエリを修正しなければなりませんでした。

1)get_posts()をWP_Queryに変更しました

2)これを自分のfunctions.phpファイルに追加しました。

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

3)それから私はそれが実行される直前にそのアクションでクエリを修正し、それから他のクエリに影響しないようにその直後にアクションを削除します:

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