我试图"导入"将Wordpress核心转换为自己的脚本以使用wp_query等功能。我已经在子目录(自己的框架)中创建了一个脚本,并希望通过wordpress扩展它,但每次脚本都会抛出错误:
致命错误:在 ... / wordpress / wp-includes / taxonomy.php 上的非对象上调用成员函数add_rewrite_tag()< b> 333
例如(当我删除add_action时(&#39; init&#39;,&#39; create_initial_taxonomies&#39;,0)):
致命错误:在 ... / wordpress / wp-includes / post.php 上的非对象上调用成员函数add_rewrite_tag()< b> 1006
非对象是$ wp_rewrite-object。我已经回应了一些事情,并发现第一个$ wp_rewrite是有效的,而下一次调用没有。我在WP核心文件中没有改变任何内容。
我尝试通过调用
来包含核心 require_once(BASE_PATH . 'wp-load.php');
有人对我有什么想法吗?
感谢
答案 0 :(得分:22)
简短回答,做到这一点:
define('WP_USE_THEMES', false);
global $wp, $wp_query, $wp_the_query, $wp_rewrite, $wp_did_header;
require(BASE_PATH . 'wp-load.php');
很长的答案,使用PHP导入脚本是一个微妙的问题。
如果在所有函数之外定义局部变量,则可以使用“global”在函数内检索它。如果函数内部有局部变量,则以后不能使用global检索它,除非它被定义为全局变量。
脚本'wp-settings.php'是问题所在。它包含在你的电话中,包括'wp-load.php'。
那里定义的变量 not 表示为全局变量;相反,这是假定的,因为脚本总是在任何函数之外运行,因此自动全局。即。
$wordpress = 'foo';
function wordpressFunction() {
global $wordpress;
}
因为您要在函数中导入脚本,所以它们现在变为局部变量。你基本上是这样做的:
function myFramework() {
$wordpress = 'foo';
function wordpressFunction() {
global $wordpress;
}
}
因此,修复是在导入脚本之前将它们定义为全局。现在可以正确找到$ wp_query和其他定义为全局的内容。
答案 1 :(得分:2)
访问wordpress编程的所有内容的最简单方法是使用以下内容:
require_once('/../../../wp-blog-header.php'); // Use actual root path to wp-blog-header.php
header("HTTP/1.0 200 OK");
使用上面的代码,您将获得使用WordPress中的模板通常可以获得的所有功能。我已经尝试了上面列出的所有其他方法,这个方法是迄今为止最好的方法。
答案 2 :(得分:1)
我有同样的错误。我想得到一些文章和永久链接。这有助于:
global $wpdb, $wp_rewrite;
require '/(...)/wp-config.php';
$result = $wpdb->get_results( $wpdb->prepare( ... ) );
foreach( $result as &$item )
$item->link = get_permalink( $item->ID );
我还发现这在另一个案例中很有用: http://www.stormyfrog.com/using-wpdb-outside-wordpress/