Почему CRON задача отрабатывает некорректно в сравнении с хуком admin_init?

Рейтинг: 0Ответов: 1Опубликовано: 23.01.2023

Есть медиатека фильмов на wordpress, данные для которой я получаю по Rest API и записываю в посты соответственно на каждый из фильмов.

Настроил CRON задачу (при помощи wordpress) для периодического обновления контента, но столкнулся с проблемой корректного стягивания контента: при каждой попытке активации, создаётся выборочный пост из запроса, причём без постера, т.е. функция set_post_thumbnail не отрабатывает..

Но, если отключаю хук с активацией крона cron_activation и вместо хука query_films прописываю

add_action('admin_init', 'function_query_films');, то непосредственно принудительное создание постов отрабатывает корректно.

В чем может быть причина и как поправить?

Код

add_action( 'admin_head', 'cron_activation' );
function cron_activation() {
    if( ! wp_next_scheduled( 'query_films' ) ) {
        wp_schedule_single_event( time(), 'query_films' );
    }
}

//add_action('admin_init', 'function_query_films');
add_action( 'query_films','function_query_films' );
function function_query_films(){

   $term_id     = 500; // get_queried_object()->term_id;
   $term_childs = get_term_children( $term_id, 'category' );

   foreach ( $term_childs as $child ) {

      $company_id = get_term_meta( $child, 'company_id', true );

      if($company_id) {

        $url = URL_PATH .'films?companyId='. $company_id;
        $options = array('http' => array(
           'method'  => 'GET',
           'header' => 'Authorization: Bearer '.BEARER_TOKEN
        ));
        $context  = stream_context_create($options);
        $response = file_get_contents($url, false, $context);

        if($response) {
          $json_array = json_decode($response, true);
          if(is_array($json_array)) {
             foreach($json_array as $json_value) {
                $post_data = array(
                   'post_title'    => sanitize_text_field( $name ),
                   'post_content'  => $content,
                   'post_category' => array(5),
                   'post_status'   => 'publish',
                   'post_type'      => 'post',
                   'post_author' => 1
                );
                $post_id = wp_insert_post( $post_data );
                $img_id = media_sideload_image( $json_value["img_url"], $post_id); 
                $thumbnail = set_post_thumbnail( $post_id, $img_id );
             }
          }
        }
      }
   }
}

Ответы

▲ 1Принят

В режиме cron (а это отдельный http запрос к сайту) грузится иной набор файлов ядра, чем в режиме admin. У вас не set_post_thumbnail не отрабатывает, а media_sideload_image, потому что media_sideload_image находится в файле wp-admin\includes\media.php. Этот файл подключается в админке и не подключается на фронте и в cron.

Вы увидите fatal error "function media_sideload_image does not exist", если включите логи и посмотрите в них.

Чтобы ваш код заработал, в function_query_films() надо добавить

/** WordPress Media Administration API */
require_once ABSPATH . 'wp-admin/includes/media.php';