【问题标题】:Include Wordpress Core into own Scripts将 Wordpress Core 包含到自己的脚本中
【发布时间】:2012-02-01 18:53:43
【问题描述】:

我正在尝试将 Wordpress 核心“导入”到自己的脚本中以使用 wp_query 等功能。我在子目录(自己的框架)中创建了一个脚本,并希望通过 wordpress 扩展它,但每次脚本抛出错误:

致命错误:在 .../wordpress/wp-includes/taxonomy.php 中的非对象上调用成员函数 add_rewrite_tag() b>333

例如(当我删除 add_action('init', 'create_initial_taxonomies', 0)):

致命错误:在 .../wordpress/wp-includes/post.php 中的非对象上调用成员函数 add_rewrite_tag() b>1006

非对象是 $wp_rewrite-object。我已经回显了一些东西,并发现第一个 $wp_rewrite 是有效的,而在下一次调用时则不是。我没有改变 WP 核心文件。

我尝试通过调用来包含核心:

    require_once(BASE_PATH . 'wp-load.php');

有人给我一些想法吗?

谢谢

【问题讨论】:

    标签: wordpress include


    【解决方案1】:

    简短的回答,这样做:

    define('WP_USE_THEMES', false);
    global $wp, $wp_query, $wp_the_query, $wp_rewrite, $wp_did_header;
    require(BASE_PATH . 'wp-load.php');
    

    长答案,这是一个关于使用 PHP 导入脚本的微妙问题。

    如果您在所有函数之外定义了一个局部变量,则可以使用“全局”在函数内部检索它。如果你在函数中有一个局部变量,那么以后就不能使用全局来检索它,除非它在那里被定义为全局。

    脚本“wp-settings.php”是问题所在。它通过您的调用包含“wp-load.php”。

    那里定义的变量没有声明为全局的;相反,这是假定的,因为脚本总是在任何函数之外运行,因此是自动全局的。即

    $wordpress = 'foo';
    
    function wordpressFunction() {
        global $wordpress;
    }
    

    因为您是在函数中导入脚本,所以它们现在成为局部变量。你实际上是在做:

    function myFramework() {
        $wordpress = 'foo';
    
        function wordpressFunction() {
            global $wordpress;
        }
    }
    

    所以解决方法是在导入脚本之前将它们定义为全局。现在 $wp_query 和其他定义为全局的都正确找到了。

    【讨论】:

    • 经过一些测试,我也发现了这一点。 wordpress 中的作用域有时会让人发疯。当一个函数包含核心时,整个核心都会出现问题,因为变量处于不可读的范围内
    • 添加全局变量似乎对我没有帮助,但它至少帮助我确定了问题,我发现在全局范围内加载 wordpress(而不是加载它的函数)解决了我的问题.谢谢!
    • @EricAnderson 我猜全局变量可能已经改变了。
    • @JL235 就像一个魅力,美丽的解释
    【解决方案2】:

    访问 wordpress 已编程的所有内容的最简单方法是使用以下内容:

    require_once('/../../../wp-blog-header.php'); // Use actual root path to wp-blog-header.php
    header("HTTP/1.0 200 OK");
    

    使用上面的代码,您将获得通常在 WordPress 中使用模板获得的所有功能。上面列出的所有其他方法我都试过了,这是迄今为止最好的。

    【讨论】:

      【解决方案3】:

      我有同样的错误。我想获得一些文章和永久链接。这有帮助:

      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/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多