Инициализируйте среду WordPress для использования в сценарии командной строки

25

У меня есть скрипт командной строки для поддержки плагина wordpress и я должен загрузить ядро ​​wordpress, чтобы иметь возможность доступа к функциям wordpress.

Эта проблема очень похожа на инициализацию среды WordPress для использования в реальном скрипте cron . Хотя он отличается от него, поскольку указанный вопрос предполагается использовать с (настоящим) скриптом cron, который можно выполнить иначе, чем запустить скрипт php из командной строки. Поскольку на указанный вопрос уже дан ответ, и этот ответ не удовлетворяет моим потребностям, я начал этот вопрос.

Так что же нужно в скрипте командной строки для инициализации среды wordpress?

Связанный

xaedes
источник

Ответы:

27

Я придумал следующее решение. Сценарий должен начинаться со следующего кода.

<?php
    if( php_sapi_name() !== 'cli' ) {
        die("Meant to be run from command line");
    }

    function find_wordpress_base_path() {
        $dir = dirname(__FILE__);
        do {
            //it is possible to check for other files here
            if( file_exists($dir."/wp-config.php") ) {
                return $dir;
            }
        } while( $dir = realpath("$dir/..") );
        return null;
    }

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

Связанный

xaedes
источник
Просто чтобы добавить к этому, вы захотите продолжить ob_end_clean();после этого, иначе WordPress захватывает весь ваш вывод и ничего не показывает до самого конца.
Хош Садик
13

Если вы не хотите иметь дело с процессом грязного погрузочной WordPress вручную, вы можете просто использовать WP-CLI «сек eval-fileкоманду:

wp eval-file my-script.php

my-script.phpФайл может содержать любой вызов функции WP. Например:

<?php
global $wpdb;

echo implode( ' ', $wpdb->tables() ) . "\n";
scribu
источник
Так что eval-fileделает все функции WordPress доступными, не имея requireничего? Этот ответ будет более понятным с помощью быстрого примера такого сценария PHP.
Кольцо Келин,
2
@KaelinColclasure Yep; Добавлен пример.
scribu