Initialisieren Sie die WordPress-Umgebung für die Verwendung in Befehlszeilenskripten

25

Ich habe ein Befehlszeilenskript zur Pflege eines WordPress-Plugins und muss den WordPress-Kern laden, um auf WordPress-Funktionen zugreifen zu können.

Dieses Problem ähnelt stark der Initialize WordPress-Umgebung, die in einem echten Cron-Skript verwendet werden soll . Obwohl es sich davon unterscheidet, da die betreffende Frage für die Verwendung mit einem (echten) Cron-Skript gedacht ist, was ansonsten durch Starten eines Befehlszeilen-PHP-Skripts erreicht werden kann. Da die angesprochene Frage bereits beantwortet ist und diese Antwort meine Bedürfnisse nicht erfüllt, habe ich mit dieser Frage begonnen.

Was ist also in einem Befehlszeilenskript erforderlich, um die WordPress-Umgebung zu initialisieren?

verbunden

xaedes
quelle

Antworten:

27

Ich habe die folgende Lösung gefunden. Das Skript muss mit dem folgenden Code beginnen.

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

verbunden

xaedes
quelle
Um dies noch zu ergänzen, sollten Sie danach ausführen ob_end_clean();, da andernfalls WordPress Ihre gesamte Ausgabe erfasst und bis zum Ende nichts anzeigt.
Hosh Sadiq
13

Wenn Sie nicht manuell mit dem chaotischen Prozess des Ladens Wordpress beschäftigen möchten, können Sie einfach verwenden WP-CLI s‘ eval-fileBefehl:

wp eval-file my-script.php

Die my-script.phpDatei kann einen beliebigen WP-Funktionsaufruf enthalten. Beispielsweise:

<?php
global $wpdb;

echo implode( ' ', $wpdb->tables() ) . "\n";
scribu
quelle
Stellt man also eval-filealle WordPress-Funktionen zur Verfügung, ohne requireetwas zu müssen? Diese Antwort wäre mit einem kurzen Beispiel eines solchen PHP-Skripts klarer.
Kaelin Colclasure
2
@KaelinColclasure Yep; Beispiel hinzugefügt.
Scribu