2011-03-15 11 views
30

Próbuję połączyć się z Wordpress przy użyciu WPDB, ponieważ jest to tak piękna klasa, a także istnieją konfiguracje określone w pliku wp-config.php, więc nie będę musiał określać go ponownie.Korzystanie z WPDB w samodzielnym skrypcie?

Zamierzam napisać mały oddzielony skrypt z głównego WordPressa, aby uruchomić w tle, który będzie musiał użyć tej instancji WPDB.

Jak mogę to zarchiwizować?

Każda pomoc jest doceniana.

Odpowiedz

40

Najlepszym (najszybsza i najbezpieczniejsza) sposób, aby załadować tylko załadować podstawową funkcjonalność WordPress jest użycie flagi SHORTINIT takiego:

define('SHORTINIT', true); 

require('/path/to/wp-load.php'); 

//Here you can use WordPress core features, for example the $WPDB object 

Aby uzyskać więcej informacji na ten temat i zobaczyć, co jest załadowany , jest sprawdzenie kodu w /wp-settings.php.Nie znajdziesz następującą sekcję:

// Stop most of WordPress from being loaded if we just want the basics. 
if (SHORTINIT) 
    return false; 

Oznacza to, że nic po tym nie zostanie załadowany, i to całkiem sporo rzeczy, jak widać. Ślad będzie znacznie mniejszy niż samo ładowanie wp-load.php i nadal daje dostęp do wszystkich wbudowanych funkcji rdzenia WordPress, w przeciwieństwie do np. /wp-includes/wp-db.php bezpośrednio. Wiele funkcji w rdzeniu WP ma również zależności w innych plikach i może być bałagan, aby dowiedzieć się dokładnie, jakie pliki należy dołączyć, aby móc robić to, co chcesz. SHORTINIT zawiera potrzebne zależności, więc nie musisz się o to martwić.

Jeśli wiesz dokładnie, czego potrzebujesz, na przykład tylko WPDB, najszybszym sposobem jest oczywiście tylko uwzględnienie potrzebnych plików, ale SHORTINIT zapewnia bezpieczniejszy i bardziej wystandaryzowany sposób ładowania rdzenia WP i zależności. Z SHORTINIT WordPress nie ładuje wtyczek, większości części interfejsu API wtyczki, motywów, funkcji kompozycji i większości funkcji administracyjnych i frontendowych. Tutaj ciężki kod znajduje się w typowej instalacji WordPress. W większości przypadków uważam, że wartośćjest warta niewielkiego kompromisu w zakresie szybkości/wydajności w porównaniu z włączeniem tylko tych plików, które są potrzebne, a to w większości przypadków ogromny wzrost wydajności w porównaniu do pełnego obciążenia.

+0

To zdecydowanie najlepsza odpowiedź! –

+0

Zdecydowanie najlepsza odpowiedź przy użyciu SHORTINIT dla niestandardowych skryptów jest DUŻO szybsza. –

+0

Dziękujemy! Dokładnie tego potrzebowałem. sam wp-db.php wymaga niektórych zewnętrznych funkcji WP, które nie są uwzględniane, a to rozwiązuje. –

41
<?php 

$path = $_SERVER['DOCUMENT_ROOT']; 

include_once $path . '/wp-config.php'; 
include_once $path . '/wp-load.php'; 
include_once $path . '/wp-includes/wp-db.php'; 
include_once $path . '/wp-includes/pluggable.php'; 

// $wpdb is available, do stuff 
+20

Czy nie wystarczy "wp-load.php"? –

+2

Tak, wp-load jest wystarczający sam, ładuje całą resztę - innymi słowy, ładuje cały WordPress zawierający wszystkie wtyczki. –

16

WordPress faktycznie pozwala na korzystanie z własnego DBA (warstwy abstrakcji bazy danych) tylko poprzez utworzenie pliku o nazwie db.php i zapisanie go w głównym katalogu wp-content.

Miałem problem z koniecznością dostępu do bazy danych w klasie, którą napisałem, która nie miała nic wspólnego z WordPressem, ale nie chciałem stworzyć zupełnie nowego DBA, po prostu z tym skryptem.

Ponieważ domyślnym WPDB nie pozwalają na skorzystanie wzór fabryczny, szybko napisał kilka wierszy, aby go wesprzeć i dodał ją do db.php ...

<?php 

class DB extends wpdb 
{ 
    protected static $instance = null; 

    public static function getInstance() 
    { 
    if (!self::$instance) { 
     self::$instance = new DB(DB_USER, DB_PASSWORD, DB_NAME, DB_HOST); 
    } 

    return self::$instance; 
    } 
} 

$wpdb = DB::getInstance(); 

Teraz kiedy konieczności korzystania z wpdb gdzie indziej (w moim przypadku nie-WordPress klasy), można juse zastosowanie:

$wpdb = DB::getInstance(); 

od wewnątrz metody, zamiast strasznej global.

+0

piękny sposób na uzyskanie $ wpdb – hidden

+0

Wow, gdzie mogę dowiedzieć się więcej o plikach DBA i db.php WordPressa? – BenRacicot

+0

Problem z tym, że kod nadal wywołuje funkcje WordPress, takie jak apply_filter. Próbuję znaleźć sposób na dołączenie wszelkich innych nieistniejących plików PHP (lub całej rzeczy). –

11

Możesz użyć $ wpdb w nowym pliku .php znajdującym się w folderze kompozycji, używając poniższego kodu.

$url = (!empty($_SERVER['HTTPS'])) ? "https://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] : "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; 
$url = $_SERVER['REQUEST_URI']; 
$my_url = explode('wp-content' , $url); 
$path = $_SERVER['DOCUMENT_ROOT']."/".$my_url[0]; 

include_once $path . '/wp-config.php'; 
include_once $path . '/wp-includes/wp-db.php'; 
include_once $path . '/wp-includes/pluggable.php'; 

global $wpdb; 
+0

O ile widzę, jest to jedyny sposób, o którym mowa tutaj ładowanie minimalnego kodu, aby po prostu użyć wpdb, bez ładowania całego WordPress ... –

2

Wystarczy wykonać dwa kroki.

  1. dołączyć plik wp-blog-header.php
  2. przed użyciem $ wpdb, umieścić jako global $ wpdb;

dowolne zmienne globalne, których można użyć na tej stronie po tym. Upewnij się, że podajesz prawidłową ścieżkę do pliku wp-blog-header.php. Nie ma potrzeby dołączania kilku plików.

3

powinieneś just require_once ("../../../ wp-load.php");

, a następnie wszystkie haseł klasy wordpress i wszystko zostanie załadowane. teraz możesz uruchomić interect przy użyciu bazy danych za pomocą globalnej $ wpdb, a instancja wpdb zostanie uruchomiona

4

Musisz tylko dołączyć plik wp-load.php do skryptu.

require('the/path/to/wp-load.php file'); 
4

To powinno załatwić sprawę TOO:

preg_match('/^(.+)wp-content\/.*/', dirname(__FILE__), $path); 
    include($path[1] . 'wp-load.php'); 
1

szybki i lekki sposób z tylko jednej linii jest

require (dirname (_FILE__) "/ wp-blog-header.php. ");

Powód jest ponieważ wordpress inicjuje ładowanie index.php i po sprawdzeniu index.php, widzisz:

require (dirname (__FILE__) '/ wp-blog-header.php'). ;

To ładuje i ładuje program wordpress.

więc używać WordPress poza WordPress zainstalować, wystarczy utworzyć nowy plik, a następnie napisać:

wymagać; (dirname (__FILE__) '/ wp-blog-header.php').

następnie dla testu napisz: global $ wpdb; var_export ($ wpdb).

dzięki czemu masz teraz dostęp do wszystkich interfejsów API wordpress i obiektu bazy danych $ wpdb.

Powiązane problemy