Zainicjuj środowisko WordPress do użycia w skrypcie wiersza poleceń

25

Mam skrypt wiersza poleceń do obsługi wtyczki wordpress i muszę załadować rdzeń wordpress, aby uzyskać dostęp do funkcji wordpress.

Ten problem jest bardzo podobny do inicjalizacji środowiska WordPress do użycia w prawdziwym skrypcie cron . Chociaż różni się od tego, ponieważ zadane pytanie ma być używane ze (prawdziwym) skryptem cron, który można wykonać inaczej niż poprzez uruchomienie skryptu php z linii poleceń. Ponieważ na zadane pytanie już udzielono odpowiedzi i ta odpowiedź nie spełnia moich potrzeb, zacząłem to pytanie.

Więc co jest potrzebne w skrypcie wiersza poleceń, aby zainicjować środowisko wordpress?

Związane z

Xaedes
źródło

Odpowiedzi:

27

Wymyśliłem następujące rozwiązanie. Skrypt musi zaczynać się od następującego kodu.

<?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');

Związane z

Xaedes
źródło
Aby dodać do tego, będziesz chciał uruchomić ob_end_clean();później, ponieważ w przeciwnym razie Wordpress przechwytuje wszystkie dane wyjściowe i nie pokazuje niczego do samego końca.
Hosh Sadiq
13

Jeśli nie chcemy mieć do czynienia z procesem brudny załadunku WordPress ręcznie, można po prostu użyć WP-CLI „s eval-filepolecenie:

wp eval-file my-script.php

my-script.phpPlik może zawierać dowolne wywołanie funkcji WP. Na przykład:

<?php
global $wpdb;

echo implode( ' ', $wpdb->tables() ) . "\n";
scribu
źródło
Czyli eval-filewszystkie funkcje WordPress są dostępne bez requireniczego? Ta odpowiedź byłaby bardziej zrozumiała na podstawie szybkiego przykładu takiego skryptu PHP.
Kaelin Colclasure
2
@KaelinColclasure Yep; dodany przykład.
scribu