Использование WPDB в автономном скрипте? - PullRequest
44 голосов
/ 15 марта 2011

Я пытаюсь подключиться к WordPress с помощью WPDB, потому что это такой красивый класс, а также есть конфигурации, указанные в wp-config.php, поэтому мне не нужно будет указывать его снова.

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

Как мне заархивировать это?

Любая помощь приветствуется.

Ответы [ 9 ]

62 голосов
/ 06 августа 2014

Лучший (самый быстрый и безопасный) способ загрузить только основные функции WordPress - это использовать флаг SHORTINIT, например:

define( 'SHORTINIT', true );

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

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

Для получения дополнительной информации об этом и посмотреть, что загружено, проверьте код в /wp-settings.php. Там вы найдете следующий раздел:

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

Это означает, что все, что после этого не будет загружено, и это довольно много вещей, как вы можете видеть. Занимаемая площадь будет намного меньше, чем просто загрузка wp-load.php, и все равно даст вам доступ ко всем встроенным функциям в ядре WordPress, в отличие, например, от /wp-includes/wp-db.php напрямую. Многие функции в ядре WP также имеют зависимости в других файлах, и может быть сложно определить, какие именно файлы вам нужно включить, чтобы иметь возможность делать то, что вы хотите. SHORTINIT включает в себя необходимые зависимости, поэтому вам не нужно об этом беспокоиться.

Если вы точно знаете, что вам нужно, например, только WPDB, конечно, самый быстрый способ - это включить только нужные вам файлы, но SHORTINIT обеспечивает более безопасный и стандартизированный способ загрузки ядра WP и зависимостей. С SHORTINIT WordPress не загружает плагины, большинство частей плагина API, темы, функции тем и большинство функций администратора и внешнего интерфейса. Это где тяжелый код находится в типичной установке WordPress. В большинстве случаев я думаю, что SHORTINIT стоит небольшого компромисса в скорости / производительности по сравнению с включением только тех файлов, которые вам нужны, и в большинстве случаев это огромный прирост производительности по сравнению с полной загрузкой.

47 голосов
/ 17 марта 2011
<?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
19 голосов
/ 24 марта 2011

WordPress фактически позволяет вам использовать свой собственный DBA (уровень абстракции базы данных), просто создав файл с именем db.php и сохранив его в корне каталога wp-content.

У меня была проблема смне нужно было получить доступ к базе данных через класс, который я написал, у него ничего не было с WordPress, но я не хотел создавать совершенно новых администраторов баз данных, просто следуйте этому сценарию.чтобы использовать фабричный шаблон, я быстро написал несколько строк для его поддержки и добавил его к 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();

Теперь, когда нужно использовать wpdb из другого места (в моем случаекласс, отличный от WordPress), вы можете использовать juse:

$wpdb = DB::getInstance();

из метода, а не ужасного global.

14 голосов
/ 28 февраля 2012

Вы можете использовать $wpdb в новом .php файле, который находится внутри папки темы, используя следующий код.

$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;
4 голосов
/ 18 февраля 2015

Это тоже должно сработать:

  preg_match('/^(.+)wp-content\/.*/', dirname(__FILE__), $path);
  include($path[1] . 'wp-load.php');
4 голосов
/ 12 февраля 2014

Вам просто нужно включить файл wp-load.php в ваш скрипт.

require('the/path/to/wp-load.php file');
3 голосов
/ 13 ноября 2013

Вы должны просто require_once('../../../wp-load.php');

И тогда вы загрузите все классы WordPress, хуки и все. Теперь вы можете начать взаимодействовать с базой данных, используя global $wpdb;, и будет запущен экземпляр wpdb.

2 голосов
/ 16 августа 2013

Достаточно выполнить два следующих шага.

  1. Включить файл wp-blog-header.php
  2. Перед использованием $ wpdb укажите как глобальный $ wpdb;

любые глобальные переменные, которые вы можете использовать на этой странице после этого.Убедитесь, что вы указали правильный путь включения wp-blog-header.php.Не нужно включать несколько файлов.

1 голос
/ 15 мая 2017

Быстрый и легкий способ с одной строкой -

require (dirname ( _FILE __ ). '/ Wp-blog-header.php');

Причина в том, что WordPress инициализирует загрузку index.php, и когда вы проверяете index.php, вы видите:

require (dirname ( __ FILE __ ). '/ Wp-blog-header.php');

Это загружает и загружает WordPress.

чтобы использовать WordPress вне установки WordPress, просто создайте новый файл и напишите:

require (dirname ( __ FILE __ ). '/ Wp-blog-header.php ');

затем для теста напишите: global $ wpdb;var_export ($ wpdb).

так что теперь у вас есть доступ ко всем WordPress API и объекту базы данных $ wpdb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...