wp_insert_post, вызываемый через cron, дублирует сообщения вместо их обновления - PullRequest
0 голосов
/ 30 июня 2019

В настоящее время я застрял в проблеме, которую не могу найти в проекте WordPress. Вот в чем дело: Я создал плагин, который запрашивает API и обрабатывает его данные для вставки постов. Проблема, с которой я сталкиваюсь, заключается в том, что, когда основная функция запускается вручную (т.е. через маршрут или запускается вручную cron), сообщения создаются и обновляются правильно, но когда cron выполняется автоматически, сообщения всегда дублируются. Возможно, я сузил проблему до возможностей (я проверяю, существуют ли записи, запрашивая у cpt уникальное метаполе), и когда cron выполняется самостоятельно, он не находит идентификаторов.

Вот примеры кода:

  public function insertPosts() {
    set_current_user(1); // <- here I tried setting the user as admin for the script, but it didn't work
    // First, get all prestations from the api
    $prestations = $this->api->getPrestations();

    /*
     * Then :
     * we remove sessions of formations initiales, which are useless (gamme id 10 = formations initiales)
     * I could have "only" taken the ids I need, but unsetting useless array entries allows for a lighter dataset
     */
    $prestations_info = [];
    foreach ($prestations as $key => $prestation) {
      if ($prestation['gamme']['id'] == 10) {
        // Removes the useless $prestation and breaks out of the loop so its ID's not stored
        unset($prestations[$key]);
        continue;
      }
      $prestations_info[] = [
        'fid' => $prestation['id'],
        'cat_name' => $prestation['gamme']['name'],
        'cat_id' => $prestation['gamme']['id']
      ];
    }

    /*
     * Then :
     * Parse the array to process every id individually and query the api for core informations for the singles
     */
    foreach ($prestations_info as $presta) {
      // Meta query to check if a post with the formation's id already exists
      $args = [
        'post_type' => 'formations',
        'posts_per_page' => -1,
        'meta_query' => [
          [
            'key' => 'api_fid',
            'value' => $presta['fid'],
            'compare' => '='
          ]
        ]
      ];

      $posts = new WP_Query($args);

      if ($posts->have_posts()) {
        while ($posts->have_posts()) {
          // If a post with that formation id already exists, we retrieve its ID:
          // this way, we can update existing post and avoid duplicates
          $posts->the_post();
          $post_id = get_the_ID();
        }
      }

      $body = $this->api->getSessionsByPrestationsId($presta['fid']);

      $post_array = [];
      $locations = [];
      $nb_places = [];

      foreach ($body as $key => $item) {
        if (!empty($item['seances'])) {
          $duration = BOUtilities::getFormationDuration($item['seances']);
          $dates = BOUtilities::getDatesPerSessions($item['seances']);
        }

        if ($dates) {
          $session_date = [];
          if (is_array($dates)) {

            foreach ($dates as $i => $date) {
              $session_date[$i] = [
                  'dates' => $date['start'] .' - ' . $date['end'],
                ];
            }
          } else {
            $session_date[] = [
              'dates' => $dates,
            ];
          }
        }

        if (!empty($item['location'])) {
          $locations[] = strtolower($item['location']);

          $session[] = [
            'sessions_location' => $item['location'],
            'sessions_dates' => $session_date,
          ];
        }

        if (!empty($item['nbplace']) && $item['nbplace'] != 0) {
          if (!in_array($item['nbplace'], $nb_places)) {
            $nb_places[] = $item['nbplace'];
          }
        }

        if ($item['price'] != 0) {
          $prices[] = $item['price'];
        }
      }

      $formatted_cost = BOUtilities::setPrices($prices);
      $effectifs = BOUtilities::setEffectifs($nb_places);

      if ($post_id) {
        $post_array = [
          'ID' => $post_id,
          'post_type' => 'formations',
          'post_title' => $item['prestation']['name'],
          'meta_input' => [
            'api_fid' => $presta['fid'],
            'aside_cost' => $formatted_cost,
            'aside_duration' => ($duration > 1  ? $duration . ' jours' : $duration . ' jour'),
            'aside_effectifs' => $effectifs,
          ]
        ];
        $inserted_post = wp_update_post($post_array);
      }
      else {
        $post_array = [
          'post_type' => 'formations',
          'post_title' => $item['prestation']['name'],
          'meta_input' => [
            'api_fid' => $presta['fid'],
            'aside_cost' => $formatted_cost,
            'aside_duration' => ($duration > 1  ? $duration . ' jours' : $duration . ' jour'),
            'aside_effectifs' => $effectifs,
          ]
        ];
        $inserted_post = wp_insert_post($post_array);
      }

      // The cron does not have the capability of adding taxonomy terms, they need to be be added separately
      $inserted_terms = wp_set_object_terms($inserted_post, $presta['cat_name'], 'categories_formations');
      $inserted_terms = wp_set_object_terms($inserted_post, $locations, 'ville');
      update_field('aside_sessions', $session, $inserted_post);
      unset($dates);
      unset($session);
      unset($formatted_cost);
      unset($nb_places);
      unset($prices);
    }
  }

Это очень большая работа, но сейчас я в тупике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...