Этот код извлекает некоторые данные из внешнего API, проверяет, не сохранены ли извлеченные события в базе данных WP как пользовательские сообщения (события) (если да, то он выполняет еще один вызов API, чтобы получить подробную информацию о событии, чтобы увидеть если он не был закрыт и не обновил метаданные.
Если извлеченное событие не соответствует ни одному из событий, уже имеющихся в базе данных WP, оно добавляет его, назначая указанный термин таксономии.
Если я иметь весь приведенный ниже код в моем файле шаблона архива пользовательской таксономии, все работает так, как задумано. Однако я понимаю, что это не лучшее место для хранения такого кода. Если я переместу приведенный ниже код в functions. php, кажется для работы с выполнением назначения термина таксономии (короткий фрагмент чуть ниже). Он просто вообще не назначает никаких терминов таксономии. Как только я верну весь код в свой шаблон, все снова будет хорошо
$is_category_specified = ($category ? $category: 'Other' );
$hq_category = ( term_exists($is_category_specified, 'event_category') ? $is_category_specified: 'Other' );
wp_set_object_terms($pid, $hq_category, 'event_category');
Полный фрагмент:
<?php
$request = wp_remote_get( 'https://api.xxxxxxx' );
if( is_wp_error( $request ) ) {
echo "wrong request";
return false; // Bail early
}
function utf8ize($mixed) {
if (is_array($mixed)) {
foreach ($mixed as $key => $value) {
$mixed[$key] = utf8ize($value);
}
} else if (is_string ($mixed)) {
return utf8_encode($mixed);
}
return $mixed;
}
function getContent($req) {
$b = wp_remote_retrieve_body( $req );
$d = json_decode(utf8ize($b), true);
return $d;
}
$body = wp_remote_retrieve_body( $request );
$data = json_decode(utf8ize($body), true);
$data_events = $data['events'];
if( ! empty( $data_events ) ) {
function add_event($title, $id, $uri, $event_date, $event_status, $entries_close_date, $type, $category) {
$new_post = array(
'post_title' => $title,
'post_content' => '',
'post_status' => 'publish',
'post_author' => '2',
'post_type' => 'event',
'meta_input' => array(
'hq_id' => $id,
'event_uri' => $uri,
'event_date' => $event_date,
'event_status' => $event_status,
'entries_close_date' => $entries_close_date,
'type' => $type,
'category' => $category,
)
);
$pid = wp_insert_post($new_post);
$is_category_specified = ($category ? $category: 'Other' );
$hq_category = ( term_exists($is_category_specified, 'event_category') ? $is_category_specified: 'Other' );
wp_set_object_terms($pid, $hq_category, '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);
update_post_meta($pid, 'event_uri', $uri);
} // end of add_event function
foreach( $data_events as $event ) {
// Get the id and status of the event currently looped over
$api_id = $event["id"];
$api_status = $event["status"];
// Specify the matching criteria for extracting the post from WP
$existing_posts_arguments = array(
'hierarchical' => 1,
'meta_key' => 'hq_id',
'meta_value' => $event['id'],
'post_type' => 'event',
);
// extracting all posts matching the criteria. In theory, there should only be one post matching the criteria.
$existing_posts = get_posts( $existing_posts_arguments );
// extract the post HQ ID and status as pulled at the post creation time
$post_hq_id = get_post_meta($existing_posts[0]->ID, 'hq_id');
$post_hq_status = get_post_meta($existing_posts[0]->ID, 'event_status');
// Check if the status of the event on RHQ has not changed since its creation
// If so, update it in WP
if ( $api_id == $post_hq_id[0] ) {
if ( $api_status != $post_hq_status[0] ) {
update_post_meta($existing_posts[0]->ID, 'event_status', $api_status);
}
}
// If there are no matching events in wordpress => Create a new one
if ( count($existing_posts) < 1 ) {
//Pull the details of the individual event
$request_event = wp_remote_get( 'https://api.xxxxxxxx' . $api_id );
if( is_wp_error( $request_event ) ) {
echo "wrong request";
return false; // Bail early
}
$data_event = getContent( $request_event );
$event_category_description = $data_event['event']['category_description'];
add_event($event['name'], $event['id'], $event['uri'], $event['start_date'], $event['status'], $event['entries_close_date'], $event['type'], $event_category_description );
} // end of the if the count if statement
} // end of foreach event
} // end of looping over data_events
?>