找出具有特定元值的帖子是否存在?

时间:2018-01-18 14:00:19

标签: php wordpress

我一直在研究一个涉及自定义帖子类型的插件。这个类型的每个帖子都有一个'time'元键,我使用wp_insert_post和add_post_meta创建了帖子:

foreach ($place->result->reviews as $review) {

    //first check if the post exists using the meta data
    $query_meta = array(
        'post_type' => 'testimonials',
        'meta_query' => [
            'meta_key' => 'time',
            'meta_value' => "$review->time"]
    );

    $time_posts = new WP_Query($query_meta);

    if ($time_posts->post_count == 0) {

        //iterate the reviews module into the Total Testimonials Custom Post Type
        $post_id = wp_insert_post(array(
            'post_type' => 'testimonials',
            'post_title' => 'Review ' . $review->time,
            'post_content' => $review->text,
            'post_excerpt' => $review->text,
            'post_thumbnail' => $review->profile_photo_url,
            'post_author' => $review->author_name,
            'post_status' => 'draft',
            'comment_status' => 'closed', // if you prefer
            'ping_status' => 'closed', // if you prefer
        ));


        add_post_meta($post_id, 'time', "$review->time");
        add_post_meta($post_id, 'post_rating', $review->rating);
        add_post_meta($post_id, 'testimonial_author', $review->author_name);
        add_post_meta($post_id, 'thumbnail', $review->profile_photo_url);
    }
}

每次插件执行(它在wp-cron事件上)时,它应该从源中提取任何新的推荐,然后通过循环检查逐个解析它们以查看是否存在具有相同时间的帖子,如果确实如此,则不会发生插入 - 如果没有,则应以上述方式插入新的推荐。

我尝试通过3种方式检查现有帖子的存在:

$query_meta = array(
        'posts_per_page' => -1,
        'post_type' => 'testimonials',
        'meta_query' => array(
            array(
                'key' => 'time',
                'value' => $review->time,
                'compare' => '='
            ),
        )
    );

    $post = query_posts($query_meta);

    if (count($post) == 0) // insert

我也尝试过这种方法:

    $posts = get_posts(['meta_key' => 'time', 'meta_value' => $review->time]);

     if (count($posts) == 0) // insert

最后这样:

$query_meta = array(
        'posts_per_page' => -1,
        'post_type' => 'testimonials',
        'meta_query' => array(
            array(
                'key' => 'time',
                'value' => $review->time,
                'compare' => '='
            ),
        )
    );

    $post = new WP_Query($query_meta);

    if ($post->have_posts() == FALSE) //insert

通过这些尝试中的每一次,我最终都会获得自定义帖子类型的重复帖子。有人能告诉我这里我做错了什么吗?在我看来,检查一个帖子是否存在不应该这么困难。所以我觉得我错过了一些明显的东西。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我认为您不希望使用$ post var设置WP_Query对象,因为它是WP的原生。我很幸运,有以下几点:

$query_meta = array(
    'post_type' => 'testimonials',
    'meta_key' => 'time',
    'meta_value' => $review->time
);
$time_posts = new WP_Query( $query_meta );

if ( $time_posts->post_count == 0 ) {
    echo 'insert things';
}

答案 1 :(得分:0)

所以在尝试了我能想到的一切之后 - 我最终通过wpdb进行了直接的SQL查询。这似乎是我能够有效确定是否存在自定义元数据的帖子的唯一方法:

$hasdata = $wpdb->get_results("select * from $wpdb->postmeta where meta_key='time' and meta_value='$review->time'");

if (count($hasdata) == 0) {
      //insert data