Cron作业/激活Wordpress插件没有';t启动插入柱功能


Cron Job/Activating Wordpress Plugin doesn't fire Insert post function

我一直在试图弄清楚我的插件为什么停止工作,但还没有弄清楚原因。。基本上,插件应该通过wordpress的scheduled events hook创建一个Cron作业,然后每周通过json提要进行解析以更新帖子。当我最初设置它时,它运行得很好,现在当我激活插件时,它似乎甚至不起作用,它至少应该这样做。cron作业的激活和取消激活似乎工作得很好。

此代码片段创建每周cron活动功能。

add_filter( 'cron_schedules', 'cron_add_weekly' );
function cron_add_weekly( $schedules ) {
    // Adds once weekly to the existing schedules.
    $schedules['weekly'] = array(
        'interval' => 604800,
        'display' => __( 'Once Weekly' )
    );
    return $schedules;
}

下面的代码在激活时创建cron作业,该作业正在工作。

register_activation_hook( __FILE__, 'startupx_activation' );
function startupx_activation() {
   wp_schedule_event( time(), 'weekly', 'startupx_weekly_event_hook' );
}
add_action( 'wp', 'startupx_setup_schedule' );
function startupx_setup_schedule() {
    if ( ! wp_next_scheduled( 'startupx_weekly_event_hook' ) ) {
        wp_schedule_event( time(), 'weekly', 'startupx_weekly_event_hook' );
    }
}

然后,我创建了一个函数,用于解析/更新所有帖子并插入任何新帖子。如果某一集的提要发生更改,我会进行更新。我认为更新它比检查是否需要更新更容易。下面是一些代码。

add_action( 'startupx_weekly_event_hook', 'insert_episodes' );
function insert_episodes() {
    //load the data from the RSS
    $feed = "http://www.seanzulu.com/startupx?format=json";
    $json = json_decode(curl_get_contents($feed)); //curl_get_contents calls another function to get the feed data via cURL
    $episode_list = $json->items; //set where the episode data lives in the object for easier use
    //parse through each episode for data
    foreach($episode_list as $episode) {
        //set the post array to have the necessary data per http://codex.wordpress.org/Function_Reference/wp_insert_post
        if(get_page_by_title($episode->title,OBJECT,'post') != NULL) {
            //update post
            wp_update_post($post);
        } else {
            //insert post
            $dateCreated = date('Y-m-d H:i:s', $epoch/1000);
            $post['post_date'] = $dateCreated; //only set the date on creation
            wp_insert_post($post);
        }
    }
}

我已经删除了一些代码,因为我认为这对我遇到的问题没有必要。如果需要的话,我可以添加它。它基本上只是解析数据并设置它,以便$post具有与每个编解码器的索引匹配的正确值。在这个功能之后,我有一个功能可以停用每周偶数的日程挂钩。

register_deactivation_hook( __FILE__, 'startupx_deactivation' );
function startupx_deactivation() {
    wp_clear_scheduled_hook( 'startupx_weekly_event_hook' );
}

正如我所说,我不完全确定它为什么会崩溃,以及是什么导致它在激活插件时无法运行insert_episodes()函数。我猜这与钩子的设置方式有关,但它以前是工作的,我根本没有更改代码,它就坏了。我查看了不同函数的文档,看看那里是否发生了变化,但没有发现任何有用的东西。我不知道下一步该做什么,所以如果能深入了解我能做些什么来让它运行,我将不胜感激。如果你看到可以通过各种方式更好地优化的领域,请告诉我!如果你有问题,请告诉我,我会非常乐意回答的。提前感谢您的帮助!如果你想让我上传更多的代码,请告诉我!

更新1:我想这可能是因为我在$epoch中有一个未声明的变量。我不确定这是解决了问题,还是只是解决了我遇到的另一个问题。

您可以做的第一件事是安装"WP Crontrol"(https://wordpress.org/plugins/wp-crontrol/)。它将允许按需运行您的cron作业,这样您就可以正确地进行测试。您可能想要做的第二件事是安装"BlackBox调试栏"(https://wordpress.org/plugins/blackbox-debug-bar/)这样你就可以看到你的操作是如何执行的(比如SQL查询等)

您还可以进行一些基本的日志记录,这可能会帮助您找到问题。我发现的最简单的方法是将"记录的事件"转储到瞬态中,这样我就可以在运行cron之后获取它们。您可以将想要的任何内容转储到日志中。

对于insert_epiodes()函数内部

/*
 * Log Episode List
 */
ob_start();
var_dump( $episode_list );
$log_data = ob_get_clean();
set_transient( 'my_plugin_log', $log_data, 24 * HOUR_IN_SECONDS );

然后您可以添加日志查看器,如…

/*
 * Produce the log reports
 */
public function my_log_report()
{
?>
        <h1>Log Viewer</h1>
        <pre class="logs"><?php echo get_transient( 'my_plugin_log' ); ?></pre>
<?php
    }
add_submenu_page( 'edit.php', 'Log Viewer', 'View Logs', 'manage_options', 'my-post-logs', 'my_log_report' );

希望这能帮助你缩小问题范围。但我想说,首先要做的是检查两台服务器上的日期/时间。没有什么能像时间同步那样引起奇怪的、突如其来的问题。