Включить ядро Wordpress в собственные скрипты

Я пытаюсь "импортировать" ядро Wordpress в собственный скрипт, чтобы использовать такие функции, как wp_query и т. д. Я создал скрипт в подкаталоге (собственной структуре) и хочу расширить его wordpress, но каждый раз скрипт выдает ошибку:

критическая ошибка: вызов функции-члена add_rewrite_tag () для не-объекта в .../ wordpress / wp-includes / таксономия.в PHP on line 333

например (когда я удалить add_action ('init',' create_initial_taxonomies', 0 )):

критическая ошибка: вызов функции-члена add_rewrite_tag () для не-объекта в .../ wordpress / wp-включает / сообщение.в PHP on line 1006

Не-объект является $wp_rewrite-object. Я что-то откликнулся и понял, что первый $wp_rewrite действителен, а при следующем вызове нет. Я ничего не изменил в файлах WP core.

Я пытаюсь включить ядро по телефону:

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

есть ли у кого-нибудь идеи для меня?

спасибо

3 ответов


короткий ответ, сделайте следующее:

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

длинный ответ, это тонкий gotcha вокруг импорта скриптов с PHP.

Если вы определяете локальную переменную вне всех функций, то ее можно получить внутри функции с помощью "global". Если внутри функции есть локальная переменная,ее нельзя получить позже с помощью global, если только она не определена как глобальная.

скрипт 'wp-настройки.php-это то, в чем проблема. Он включен через ваш звонок, чтобы включить " wp-load.на PHP'.

переменные, определенные там не указано как глобальное; вместо этого это предполагается, потому что скрипт всегда запускается вне любых функций и поэтому автоматически глобален. т. е.

$wordpress = 'foo';

function wordpressFunction() {
    global $wordpress;
}

поскольку вы импортируете скрипт внутри функции, они теперь становятся локальными переменными. Вы, по существу, делаете:

function myFramework() {
    $wordpress = 'foo';

    function wordpressFunction() {
        global $wordpress;
    }
}

таким образом, исправление состоит в том, чтобы определить их как глобальные перед импортом скрипт. Сейчас $wp_query, и другие, определенные как глобальные, правильно нашли.


самый простой способ получить доступ ко всему, что wordpress запрограммировал, - использовать следующее:

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

используя приведенный выше код, вы получите все функции, которые вы обычно получаете с использованием шаблона в WordPress. Я пробовал все другие методы, перечисленные выше, и этот, безусловно, лучший.


У меня была такая же ошибка. Я хочу сделать несколько статей с постоянными ссылками. Это помогло:

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/