在外部php脚本中使用插件功能不起作用

时间:2013-01-05 作者:lhermann

我遇到了一个奇怪的问题,到目前为止我还不能解决。

我在打电话给a。通过cronjob(Debian/GNU-Linux)编写php脚本。要使用wordpress功能,我添加了:

define(\'WP_USE_THEMES\', false);
require( \'/full/path/to/wp-blog-header.php\' );
现在,数据库查询和默认wordpress功能都可以正常工作,但我也调用了插件提供的一些功能(即高级自定义字段,但该问题会影响其他插件以及我测试的插件)。返回以下php错误:

PHP Fatal error:  Call to undefined function update_field() in executed.php on line 24
这告诉我插件的功能还没有包括在内。所以在我看来,似乎需要wp博客标题。php不包含插件功能(我开始开发上述脚本时,它就是这样做的,但现在当我测试它时,它产生了一个php错误)。

wordpress的3.5升级是否会改变这里的情况?或者你们有没有人能给我一些关于为什么会发生这个问题的建议?非常感谢。

edit

我做了进一步的测试。问题似乎是,我正在shell中使用以下命令执行php:

/usr/bin/php5 -q -d memory_limit=256M /path/to/executed.php
因此,某些变量的设置$_SERVER[\'REQUEST_METHOD\']因此,Wordpress会在调试模式下给我警告。所以我所做的是,我定义了DOCUMENT_ROOT 变量,并包含我的函数。php(未加载)手册:

$_SERVER[\'DOCUMENT_ROOT\'] = \'/full/path/to/my/document/root/\';
define(\'WP_USE_THEMES\', false);
require( \'/full/path/to/wp-blog-header.php\' );
require_once( \'/full/path/to/themes/mytheme/functions.php\' );
现在它正在工作。然而,在我看来,这只是一种不健康的散步。。。

4 个回复
SO网友:brandoncamenisch

您可能在定义函数之前调用了它-为什么不钩住它呢?

类似于:

function someFunction() {
  require( \'/full/path/to/wp-blog-header.php\' );
} 
add_action(\'some_hook\', \'someFunction\');
Note: 你可以试试plugins_loaded

SO网友:Ruturaj

我不确定这个解决方案是否有效,但请尝试require_once 插件的主PHP文件保存到您的cron作业PHP文件中,或者您可以在自己的PHP中简单地重新创建该插件的功能,以完成该插件的任务。

SO网友:Mark Kaplun

Wordpress旨在从Web服务器运行,而不是从命令行运行。虽然不清楚是什么样的依赖关系导致了这种行为,但这些依赖关系确实存在,如果要从命令行“运行”wordpress,则需要模拟web服务器环境wp-cli 可能剂量和与它的集成比试图自己调用wordpress更好。

SO网友:HU ist Sebastian

使用您的cronjob调用Wordpress wp cron怎么样。php?

Wordpress使用一个准cron系统,允许您安排在预定时间之后访问网站时运行的某些功能。您可以禁用此“访问网站时执行Cronjobs”功能,而是运行真正的cronjob来调用wp cron。php每15分钟一次。

然后,您可以将需要运行的函数挂接到Wordpress cron调度中,这意味着您应该能够在此操作中使用所有Wordpress功能,包括插件功能。

步骤1:禁用WP Cron。打开wp配置。php文件。转到wp config中数据库设置的底部。php(第37行附近)。添加代码:define(\'DISABLE\\u WP\\u CRON\',\'true\');

步骤2:添加一个“真正的”cron作业来调用wp cron。php文件,您可以根据需要随时使用。

第三步:为自己编写一个插件。在这个插件中,将cron需要运行的功能编码到一个函数中。

function do_awesome_cron_stuff(){
   //do all the awesome things
}
步骤4:将您的功能连接到Wordpress CronFirst,您注册了插件激活的调度开始:

register_activation_hook(__FILE__, \'awesome_cron_scheduling_activation\');

function awesome_cron_scheduling_activation() {
    if (! wp_next_scheduled ( \'my_awesome_cron\' )) {
          wp_schedule_event(time(), \'hourly\', \'my_awesome_cron\');
         //hourly means every hour (duh), there are more keywords to use for the time differences, you can find them here:
         //https://codex.wordpress.org/Function_Reference/wp_schedule_event
    }
}
关于信息,您不直接安排函数,而是安排一个操作(此处:my\\u awesome\\u cron)。现在,我们必须将函数与动作挂钩

add_action(\'my_awesome_cron\', \'do_awesome_cron_stuff\');
最后一部分:在插件停用时停用Cron

register_deactivation_hook(__FILE__, \'awesome_cron_scheduling_deactivation\');

function awesome_cron_scheduling_deactivation() {
    wp_clear_scheduled_hook(\'my_awesome_cron\');
}
就是这样。您的cron将一直运行,一直运行,直到您禁用插件;)。

快乐的编码!

结束

相关推荐

在Functions.php中创建“无文件”页面模板

(所谓“页面模板”,我指的是具有\"Template Name\" header 可在管理页面的“模板”下拉字段中选择。)在多个实例中,我构建了页面模板,可以通过挂接到\\u内容或pre\\u get\\u帖子或类似的内容来完成。这让我想知道是否有一种方法可以在functions.php 或者不创建主题文件本身的插件。我想这样做的原因:在我想到的场景中,我通常只是复制页面。php几乎一字不差。这意味着将来对页面的任何更改。php需要制作两次。随着儿童主题的更新,这更加令人痛苦</我喜欢“模板”字段U