此 Cron JOB 代码如何帮助您?
我已经为我的网站创建了这个 Cron Job,其 postype 为 TVShows、Seasons、Episodes,它正确地获取了季,然后生成并发布,但是当现有季的剧集时间到了时,它却没有生成和发布?有朋友能帮我解决这个问题吗?
`// 步骤 1:注册自定义一分钟间隔进行测试
添加过滤器('cron_schedules','custom_one_minute_cron_schedule');
函数custom_one_minute_cron_schedule($schedules){
$schedules['every_minute'] = 数组(
'interval' => 60, // 60 秒
'display' => __('每分钟')
(英文):
返回 $schedules;
}
// 步骤 2:安排 Cron Job 每分钟运行一次(用于测试目的)
如果(!wp_next_scheduled('auto_generate_new_seasons')){
wp_schedule_event(time(),'every_minute','auto_generate_new_seasons');
}
// 步骤 3:定义回调函数以生成新的季和剧集
添加动作('自动生成新季节','生成新季节');
函数generate_new_seasons(){
全局$wpdb;
// Query to get all TMDb IDs of existing TV shows from post meta
$tmdb_ids = $wpdb->get_col("SELECT DISTINCT meta_value FROM {$wpdb->postmeta} WHERE meta_key = 'ids'");
foreach ($tmdb_ids as $tmdb_id) {
// Check if the TV show exists in the 'tvshows' custom post type
$tv_show_posts = get_posts(array(
'post_type' => 'tvshows',
'meta_key' => 'ids',
'meta_value'=> $tmdb_id,
'posts_per_page' => 1, // Only need one result
));
// If TV show does not exist, skip to the next TMDb ID
if (empty($tv_show_posts)) {
continue;
}
// If the TV show is found, process it
foreach ($tv_show_posts as $post) {
// First, check if the 'clgnrt' meta is already set to avoid duplicate generation
$clgnrt = get_post_meta($post->ID, 'clgnrt', true);
if (!$clgnrt) {
// Set the 'clgnrt' meta to '1' for the TV show to avoid regenerating it
update_post_meta($post->ID, 'clgnrt', '1');
}
}
// Now check for and import new seasons for each TMDb ID
$existing_seasons = $wpdb->get_col($wpdb->prepare(
"SELECT meta_value FROM {$wpdb->postmeta} WHERE post_id IN (
SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = 'ids' AND meta_value = %s
) AND meta_key = 'temporada'",
$tmdb_id
));
$season = 1;
while ($season) {
// Skip seasons that already exist (duplicate check)
if (in_array($season, $existing_seasons)) {
$season++;
continue;
}
// Fetch season data from TMDb API
$response = wp_remote_get("https://api.themoviedb.org/3/tv/$tmdb_id/season/$season", array(
'body' => array(
'api_key' => 'YOUR_TMDB_API_KEY',
'language' => 'en-US',
'append_to_response' => 'images'
)
));
if (is_wp_error($response) || wp_remote_retrieve_response_code($response) != 200) {
break;
}
$json_tmdb = json_decode(wp_remote_retrieve_body($response), true);
// If no season data is found, break the loop
if (!isset($json_tmdb['season_number'])) {
break;
}
// Create a new season post
$post_data = array(
'post_status' => 'publish',
'post_title' => $json_tmdb['name'] . ': Season ' . $json_tmdb['season_number'], // Season Title: "Show Name: Season 1"
'post_content' => $json_tmdb['overview'],
'post_type' => 'seasons',
);
$post_id = wp_insert_post($post_data);
if (!is_wp_error($post_id)) {
// Add meta data for the new season
add_post_meta($post_id, 'ids', $tmdb_id);
add_post_meta($post_id, 'temporada', $json_tmdb['season_number']);
add_post_meta($post_id, 'air_date', $json_tmdb['air_date']);
add_post_meta($post_id, 'dt_poster', $json_tmdb['poster_path']);
// Update the 'clgnrt' meta for seasons to avoid regeneration
update_post_meta($post_id, 'clgnrt', '1');
// Generate episodes for the new season
generate_episodes($tmdb_id, $season, $post_id);
}
$season++;
}
}}
// 步骤 4:生成每季的剧集
函数 generate_episodes($tmdb_id,$season_number,$season_post_id) {
全局$wpdb;
// Check if the episodes for this season already exist
$existing_episodes = $wpdb->get_col($wpdb->prepare(
"SELECT meta_value FROM {$wpdb->postmeta} WHERE post_id IN (
SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = 'temporada' AND meta_value = %s
) AND meta_key = 'episodio' ",
$season_number
));
$episode_number = 1;
while ($episode_number) {
// Skip episodes that already exist (duplicate check)
if (in_array($episode_number, $existing_episodes)) {
$episode_number++;
continue;
}
// Fetch episode data from TMDb API
$response = wp_remote_get("https://api.themoviedb.org/3/tv/$tmdb_id/season/$season_number/episode/$episode_number", array(
'body' => array(
'api_key' => 'YOUR_TMDB_API_KEY',
'language' => 'en-US',
'append_to_response' => 'images'
)
));
if (is_wp_error($response) || wp_remote_retrieve_response_code($response) != 200) {
break;
}
$json_tmdb = json_decode(wp_remote_retrieve_body($response), true);
// If no episode data is found, break the loop
if (!isset($json_tmdb['episode_number'])) {
break;
}
// Create a new episode post
$post_data = array(
'post_status' => 'publish',
'post_title' => $json_tmdb['name'] . ' ' . $season_number . 'x' . $episode_number, // Episode Title: "Show Name: 1x1"
'post_content' => $json_tmdb['overview'],
'post_type' => 'episodes',
);
$episode_post_id = wp_insert_post($post_data);
if (!is_wp_error($episode_post_id)) {
// Add meta data for the new episode
add_post_meta($episode_post_id, 'ids', $tmdb_id);
add_post_meta($episode_post_id, 'temporada', $season_number);
add_post_meta($episode_post_id, 'episodio', $json_tmdb['episode_number']);
add_post_meta($episode_post_id, 'air_date', $json_tmdb['air_date']);
add_post_meta($episode_post_id, 'dt_poster', $json_tmdb['still_path']);
// Update the 'clgnrt' meta for episodes to avoid regeneration
update_post_meta($episode_post_id, 'clgnrt', '1');
}
$episode_number++;
}}
// 步骤 5:测试后清理并重置 cron 作业计划
add_action('init',函数(){
如果(定义('WP_DEBUG')&& WP_DEBUG){
// 删除现有的 cron 计划以重置它
$timestamp = wp_next_scheduled('auto_generate_new_seasons');
如果 ($时间戳) {
wp_unschedule_event($timestamp,'auto_generate_new_seasons');
}
}
// Re-schedule the cron job to run hourly instead of every minute for production
if (!wp_next_scheduled('auto_generate_new_seasons')) {
wp_schedule_event(time(), 'hourly', 'auto_generate_new_seasons');
}});
`