Intereting Posts
Перемещение шаблонов страниц по умолчанию в подкаталог Multisite> Редактировать сайт> Темы – что это за темы? Как использовать manage_ $ post_type_posts_columns с подчеркиванием в типе post? Multisite – Храните пользователей только на своем сайте Почему этот тип персонализированного почтового по умолчанию имеет значение archive.php? Загрузить изображение в мета-окне Получение пользовательских полей из WordPress API JSON Как добавить rel nofollow к этому? Проектирование плагина, который использует iFrame для обработки данных в admin Пользовательские типы сообщений в меню навигации WordPress Woocommerce. Как установить стандартную цену продукта по умолчанию. Шаблон страницы CSS-файл не загружается Показать последние сообщения в категории с Twenty Ten theme widget как отобразить «Редактировать | Быстрое редактирование | Корзина | View "в пользовательском столбце WP_List_Table? Авторские сообщения на созданной автором странице

Метод объекта, вызывающий глобальный $ wpdb в header.php

Я разрабатываю плагин WordPress объектно-ориентированным способом, и я хотел бы читать данные из базы данных wordpress, используя глобальную переменную $ wpdb.

Глобальная переменная $ wpdb вызывается из одного метода класса. Класс определен в редакторе плагинов, но сам объект инстанцируется в файле header.php моей темы.

Этот метод успешно перекликается с HTML, который я жестко закодировал, но данные между ними, которые должны были считываться из $ wpdb, не повторяются.

Заранее спасибо за вашу помощь !

EDIT: вот код:

Class Custom_Header { public function print_header() { if ( isset($_SESSION['header']) ) { switch ($_SESSION['header']) { case 1: { global $wpdb; $wpdbinfo = $wpdb->get_results("SELECT * FROM bo_mytable WHERE id=3"); $content="<div>".$wpdbinfo->nameinfo."</div>"; return $content; } } } } } 

Затем в header.php:

 $custom_header = new Custom_Header(); echo $custom_header->print_header(); 

Как уже упоминалось выше, я вижу, что DIV правильно повторяется, но внутри контента не было :-(.

Solutions Collecting From Web of "Метод объекта, вызывающий глобальный $ wpdb в header.php"

Я думаю, проблема может заключаться в следующем:

 $wpdbinfo = $wpdb->get_results("SELECT * FROM bo_mytable WHERE id=3"); 

$wpdb->get_results() возвращает массив объектов, но вы ссылаетесь на свойство на $wpdbinfo ( ->nameinfo ). Вы либо захотите $wpdbinfo массив $wpdbinfo , либо если вы уверены, что получите только одну запись (возможно, безопасное предположение, если id является первичным ключом), вместо этого вы должны будете вызвать свой запрос, используя $wpdb->get_row() .

Как сказано в Codex , wpdb::get_results() :

функция возвращает весь результат запроса в виде массива

(смелый рудник)

Таким образом, ваш $wpdbinfo не является объектом, а массивом, и если вы WP_DEBUG , ваш код WP_DEBUG предупреждение.

Если вам нужна одна строка db, используйте wpdb::get_row() и когда вам нужна одна переменная (например, в вашем примере), используйте wpdb::get_var() .

Пример:

 class Custom_Header { private $db; function __construct() { $this->db = $GLOBALS['wpdb']; } public function print_header() { if ( ! isset( $_SESSION['header'] ) ) { return; } switch ( $_SESSION['header'] ) { case 1: $nameinfo = $this->db->get_var( "SELECT nameinfo FROM bo_mytable WHERE id=3" ); return printf( "<div>%s</div>", esc_html( $nameinfo ) ); } } } 

Если это не работает, убедитесь, что $_SESSION['header'] установлен и равен 1.

Наконец, вы должны избегать имен таблиц hardcoding в своем коде, потому что префикс db может легко измениться.

Когда вы используете кодирование с использованием подхода ООП, и, похоже, вы используете пользовательские таблицы, вы бы хотели создать собственный класс для переноса wpdb и настройки ваших таблиц с помощью правого префикса.

пример

 <?php namespace MyPlugin; class MyDb { private static $instance; /** @var array $tables Custom table names, without prefix */ private static $tables = array( 'my_table_1', 'my_table_2', 'my_table_3' ); private $db; /** * Makes an instance of this class accessible from anywhere */ static function instance() { if ( is_null( static::$instance ) ) { $class = get_called_class(); static::$instance = new $class; } return static::$instance; } /** * Proxies all method calls to wpdb */ function __call( $name, $args ) { return call_user_func_array( array( $this->db, $name ), $args ); } /** * Proxies all property access to wpdb */ function __get( $name ) { return $this->db->$name; } function __construct() { $this->db = $GLOBALS['wpdb']; } /** * Set custom table names in wpdb */ function prepareTables() { foreach ( static::$tables as $table ) { $wpdb->$table = $this->db->prefix . $table; } } } 

Теперь где-то в вашем плагине вы можете:

 add_action( 'plugins_loaded', function() { $mydb = MyDb::instance(); $mydb->prepareTables(); if ( is_multisite() ) { add_action( 'switch_blog', function() use($mydb) { $mydb->prepareTables(); } ); } } ); 

Таким образом, сначала ваши пользовательские таблицы устанавливаются как свойства wpdb, а в случае мультисети параметр обновляется при переключении блога.

Теперь ваш собственный класс заголовков станет примерно таким:

 <?php namespace MyPlugin; class Custom_Header { private $db; function __construct( MyDb $db ) { $this->db = $db; } public function print_header() { if ( ! isset( $_SESSION['header'] ) ) { return; } switch ( $_SESSION['header'] ) { case 1: // note how table name is dynamic $q = "SELECT nameinfo FROM {$this->db->mytable} WHERE id=3"; $nameinfo = $this->db->get_var( $q ); return printf( "<div>%s</div>", esc_html( $nameinfo ) ); } } } 

И в вашем header.php

 $custom_header = new MyPlugin\Custom_Header( MyPlugin\MyDb::instance() ); echo $custom_header->print_header(); 

Обратите внимание, что для кода выше требуется PHP 5.3+