Cron作业/激活Wordpress插件不会触发插入帖子功能

时间:2015-02-14 01:44:18

标签: php wordpress cron wordpress-plugin

我一直想弄清楚为什么我的插件停止工作并且还没弄明白为什么..基本上插件应该通过wordpress'预定事件挂钩创建一个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' );
    }
}

然后我创建了一个函数来完成所有帖子的解析/更新并插入任何新帖子。如果针对特定剧集的Feed已更改,我会进行更新。我认为更新它更容易,而不是检查它是否需要更新。下面是一些代码。

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具有与codex的索引匹配的正确值。在这个函数之后,我有一个函数可以取消每周偶数计划挂钩。

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

就像我说的那样,我不能完全确定它为什么会破坏以及是什么导致它甚至在激活插件时无法运行insert_episodes()功能。我猜它与挂钩的设置方式有关,但它在我之前和之后都没有改变代码的情况下工作。我查看了不同功能的文档,看看是否有些东西发生了变化,但我没有找到任何有用的东西。我不知道接下来应该尝试什么,所以任何关于我可能做什么以允许它运行的见解都将非常感激。如果您看到可以通过各种方式更好地优化的区域,请告诉我们!如果您有任何问题,请告诉我,我将非常乐意回答。在此先感谢您的帮助!如果您希望我上传更多代码,请告诉我们!

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

1 个答案:

答案 0 :(得分:3)

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

您还可以执行一些可帮助您找到问题的基本日志记录。我发现的最简单的方法是转储"记录的事件"进入瞬态,所以我可以抓住它们,例如,一个cron运行。您可以将所需内容转储到日志中。

对于insert_episodes()函数内部......

/*
 * 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' );

希望这可以帮助您缩小问题的范围。但我想说的第一件事就是检查两台服务器上的日期/时间。没有什么能像时间同步那样引起奇怪的,不可思议的问题。