Используете WPDB в автономном скрипте?
Я пытаюсь подключиться к Wordpress с помощью WPDB, потому что это такой красивый класс, а также есть конфигурации, которые указаны в wp-config.php, поэтому мне не нужно будет указывать его снова.
Я собираюсь написать небольшой отдельный скрипт из основного WordPress для запуска в фоновом режиме, который должен будет использовать этот экземпляр WPDB.
Как я могу заархивировать это?
Любая помощь приветствуется.
11 ответов
Лучший (самый быстрый и безопасный) способ загрузить только основные функции 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
стоит небольшого компромисса в скорости / производительности по сравнению с включением только тех файлов, которые вам нужны, и в большинстве случаев это огромный прирост производительности по сравнению с полной загрузкой.
<?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
WordPress фактически позволяет вам использовать свой собственный DBA (уровень абстракции базы данных), просто создав файл с именем db.php
и сохранить его в корне вашего wp-content
каталог.
У меня была проблема с необходимостью доступа к базе данных через класс, который я написал, который не имел ничего общего с WordPress, но я не хотел создавать совершенно новых администраторов баз данных, просто пойти с этим сценарием.
Так как по умолчанию WPDB
не позволяет использовать фабричный шаблон, я быстро написал несколько строк для его поддержки и добавил его в 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
,
Вы можете использовать $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;
Вам просто нужно require_once('../../../wp-load.php');
и тогда вы все WordPress классы перехватывает и все будет загружено. теперь вы можете начать взаимодействовать с базой данных, используя глобальный $wpdb, и экземпляр wpdb будет запущен
Вам просто нужно включить файл wp-load.php в ваш скрипт.
require('the/path/to/wp-load.php file');
Это должно сделать тоже самое:
preg_match('/^(.+)wp-content\/.*/', dirname(__FILE__), $path);
include($path[1] . 'wp-load.php');
Следующих двух шагов достаточно.
- Включите файл wp-blog-header.php
- Перед использованием $wpdb укажите как глобальный $wpdb;
любые глобальные переменные, которые вы можете использовать на этой странице после этого. Убедитесь, что вы указали правильный путь включения wp-blog-header.php. Не нужно включать несколько файлов.
Быстрый и легкий способ только с одной линией
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.
<?php
// Include the WordPress bootstrap file
require_once('/path/to/wordpress/wp-load.php');
// Access the global $wpdb object
global $wpdb;
// Use $wpdb to execute a SQL query
$results = $wpdb->get_results("SELECT * FROM my_table");
// Display the results
foreach ($results as $row) {
echo $row->column_name;
}
?>
По состоянию на 21 июня 2021 года это было в их документации https://developer.wordpress.org/reference/classes/wpdb/ , и у меня это сработало без проблем:
$wpdb = $GLOBALS['wpdb'];