Как я могу одновременно запросить всю таблицу параметров блога в многоуровневой установке Wordpress (3.0)?

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

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

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

SELECT * FROM (SELECT имя_таблицы FROM information_schema.tables WHERE имя_таблицы типа 'wp _% _ options') как t WHERE option_name = 'platform'

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

Любой совет или помощь, которую вы могли бы дать, были бы очень благодарны.

Ответ 1

Если вы хотите напрямую запросить базу данных 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');

Ответ 2

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