Как можно одновременно запросить все таблицы параметров блога в многосайтовой установке Wordpress (3.0)? - PullRequest
10 голосов
/ 29 сентября 2010

В нашей многопользовательской установке Wordpress 3.0 у нас есть настраиваемая опция для всех наших блогов, называемая «платформа». Администраторы могут ввести значение для этой платформы при создании или редактировании блога. Некоторые блоги могут не иметь платформы.

Нам необходимо создать список всех платформ и связанных с ними блогов. Проблема в том, что мы динамически создаем и удаляем блоги с помощью других механизмов сайта, поэтому у нас есть множество таблиц опций блогов с номерами, которые не обязательно являются смежными. (то есть wp_2_options, wp_4_options, wp_12_options и т. д.)

У меня такой вопрос, есть ли способ в Wordpress выбрать один вариант для всех блогов? И наоборот, можно ли выполнить запрос, который бы делал это вручную? Я пробовал что-то вроде этого безрезультатно:

ВЫБРАТЬ * ИЗ (ВЫБЕРИТЕ имя_таблицы FROM information_schema.tables ГДЕ table_name, как 'wp _% _ options') как t ГДЕ option_name = 'платформа'

Имеет ли смысл то, что я пытаюсь сделать? Опять же, я прошу прощения за отсутствие знаний MySql, но я не смог найти никаких ответов о том, как это сделать. Я мог бы также сначала запросить все эти имена таблиц, а затем запросить каждую таблицу отдельно, но это не совсем вариант, потому что у нас много блогов, и нам может потребоваться выполнить этот запрос для многих запросов страниц одновременно, и это будет добавлять сотни запросы к каждому из этих запросов.

Буду очень признателен за любые советы или помощь, которые вы, ребята, можете дать.

Ответы [ 2 ]

7 голосов
/ 29 сентября 2010

В случае, если кому-то интересно, я закончил тем, что делал это так (но я все же хотел бы знать, возможно ли выполнить поиск по именам таблиц с помощью LIKE, а затем запросить эти таблицы, если кто-нибудь знает).

// so get all the blog ids from the blogs table
$blogs = $wpdb->get_results("SELECT blog_id FROM {$wpdb->blogs}", ARRAY_A);

// build a sql statement for each blog options table, adding in the blog id for each row
$select_statements = array();
foreach ($blogs as $blog_row) {
    $select_statements[] = 'SELECT option_value, CAST( '.$blog_row['blog_id'].' AS UNSIGNED INTEGER ) AS blog_id FROM '.$wpdb->get_blog_prefix($blog_row['blog_id'])."options WHERE option_name='$option_name'";
}

// cache the results of the union of all these select statements
$option_results = $wpdb->get_results(implode(' UNION ALL ', $select_statements), ARRAY_A);
5 голосов
/ 07 ноября 2012

Если вы хотите сделать запрос непосредственно к базе данных MySQL, вы можете создать процедуру и использовать ее:

use wordpress;
Drop Procedure IF EXISTS wordpress.MyProcedure;
DELIMITER | ;
CREATE PROCEDURE MyProcedure (param1 VARCHAR(30))
BEGIN
        DECLARE tbname CHAR(50);
        DECLARE endfetch INT DEFAULT 0;
        DECLARE cur1 CURSOR FOR 
        SELECT table_name FROM information_schema.tables WHERE table_schema='wordpress' and table_name like '%options';
        DECLARE CONTINUE HANDLER FOR SQLSTATE '02000'
                SET endfetch = 1;
        OPEN cur1;
        FETCH cur1 INTO tbname;
        fetchloop: WHILE NOT endfetch DO
            SELECT tbname ; 
            SET @opt = param1;
            SET @table_name = tbname;
            SET @sql_text = concat('SELECT option_value FROM ',@table_name,' WHERE option_name=''',@opt,'''');
            PREPARE stmt FROM @sql_text;
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt;

            FETCH cur1 INTO tbname;
        END WHILE fetchloop;
END
|
DELIMITER ; |


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