WP-仅在不存在的情况下插入帖子

时间:2018-09-22 10:27:49

标签: wordpress if-statement

背景:自定义帖子(类型:事件)可以由用户手动添加(在这种情况下,不存在hq_id元数据),也可以由wp_insert_post()自动添加(从其他来源拉出)(在这种情况下,则存在hq_id) )。

有时帖子可以具有通用标题,因此在插入帖子之前检查是否存在特定标题的帖子是不够的。下面的想法是:

在尝试从其他来源插入帖子并将其与用户手动添加的帖子合并之前,请检查以下内容:

  1. 是否存在相同标题的帖子? a)否=>让我们插入它(结束) b)是的。

  2. 如果是:它是否具有hq_id元数据,并且与要插入的帖子的hq_id元数据相等。

a)是=>好的,这是重复的帖子,无需插入

b)否=>存在具有相同标题的帖子,但是hq_id不存在或不同,因此不是重复的帖子。让我们插入它。

很好,直到再次运行代码。每次似乎都添加满足2b条件的帖子。

对于每次重新运行代码,2a和2b均为真。我不确定为什么它在2a之后不退出if语句,但仍然会在2b之后退出。

此外,您将看到整个$ new_post / wp_insert_post代码块应移至某个函数,因为它已被使用两次。我应该将函数定义放在哪里,这样范围就不会有问题?

代码如下:

if( ! empty( $data_events ) ) {
    echo '<ul>';
        foreach( $data_events as $event ) {

        $title_exists = get_page_by_title( $event['name'], OBJECT, 'event');

        if ( $title_exists == null ) {
          echo 'Post of the same title does not exist - we need to insert post';
          $new_post = array(
            'post_title' => $event['name'],
            'post_content' => 'desssscccd',
            'post_status' => 'publish',
            'post_author' => '2',
            'post_type' => 'event',
            'meta_input' => array(
              'hq_id' => $event['id'],
              'hq_uri'=> $event['uri'],
              )
          );
          $pid = wp_insert_post($new_post);
          wp_set_object_terms($pid, 'riderhq', 'event_category');


        } else { // A post of the same title exists
          $my_post = get_page_by_title ( $event['name'], OBJECT, 'event' );
          $post_hq_id = $my_post->hq_id;
          if ( $post_hq_id && $post_hq_id == $event['id'] ) {
            echo "post of the same title exists and has the same hq_id - no need to insert it";
          } else {
            echo "post of the same title exists but doesnt have the same hq_id - we need to insert it";
            $new_post = array(
              'post_title' => $event['name'],
              'post_content' => 'description',
              'post_status' => 'publish',
              'post_author' => '2',
              'post_type' => 'event',
              'meta_input' => array(
                'hq_id' => $event['id'],
                'hq_uri'=> $event['uri'],
              )
          );
          $pid = wp_insert_post($new_post);
          wp_set_object_terms($pid, 'riderhq', 'event_category');

          }
        }

        echo '<li>';
        echo $event['id'];
                echo '<a href="' . esc_url( $event['uri'] ) . '">' . $event['name'] . '</a>';
        echo '</li>';

        }
      echo '</ul>';
  }

1 个答案:

答案 0 :(得分:0)

我已经稍微改变了方法,并解决了以下问题:

if( ! empty( $data_events ) ) {
    function add_event($title, $id, $uri, $event_date) {
      $new_post = array(
        'post_title' => $title,
        'post_content' => 'description',
        'post_status' => 'publish',
        'post_author' => '2',
        'post_type' => 'event',
        'meta_input' => array(
          'hq_id' => $id,
          'hq_uri'=> $uri,
          'event_date' => $event_date,
        )
      );
      $pid = wp_insert_post($new_post);
      wp_set_object_terms($pid, 'riderhq', 'event_category');
      $get_meta_time = get_post_meta($pid, 'event_date');
      $newformat = date('Ymd', strtotime($get_meta_time[0]));
      update_post_meta($pid, 'event_date', $newformat);    
    }

      foreach( $data_events as $event ) {

      $existing_posts_arguments = array(
        'hierarchical' => 1,
        'meta_key' => 'hq_id',
        'meta_value' => $event['id'],
        'post_type' => 'event',
      );

      $existing_posts = get_posts( $existing_posts_arguments );

      if ( count($existing_posts) < 1 ) {
        add_event($event['name'], $event['id'], $event['uri'], $event['start_date']); 
      }


    } // end of foreach event 
  }