我一直在试图弄清楚我的插件为什么停止工作,但还没有弄清楚原因。。基本上,插件应该通过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' );
希望这能帮助你缩小问题范围。但我想说,首先要做的是检查两台服务器上的日期/时间。没有什么能像时间同步那样引起奇怪的、突如其来的问题。