如何在Wordpress多站点安装(3.0)中同时查询所有博客选项表?

Mic*_*tty 10 mysql sql wordpress

在我们的Wordpress 3.0多站点安装中,我们为所有博客提供了一个自定义选项,称为"平台".管理员可以在创建或编辑博客时输入此平台的值.有些博客可能没有平台.

我们需要能够创建所有平台及其相关博客的列表.问题是,我们通过其他站点机制动态创建和删除博客,因此我们有许多博客选项表,其中的数字不一定是连续的.(即wp_2_options,wp_4_options,wp_12_options等)

我的问题是,在Wordpress中有没有办法在所有博客中获取选项?相反,是否有可以运行的查询可以手动执行此操作?我尝试过这样的事情没有效果:

SELECT*FROM(SELECT table_name FROM information_schema.tables WHERE table_name like'wp _%_ options')as t WHERE option_name ='platform'

我想要做什么才有意义?我再次为我缺乏MySql知识而道歉,但我无法找到任何关于如何做到这一点的答案.我还可以先查询所有这些表名,然后分别查询每个表,但这不是一个选项,因为我们有很多博客,我们可能需要同时为多个页面请求运行此查询,这将增加数百个查询每个请求.

任何建议或帮助你们都会非常感激.

Mic*_*tty 7

如果有人感兴趣,我最终会这样做(但我仍然想知道是否有可能使用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);
Run Code Online (Sandbox Code Playgroud)


ste*_*ano 5

如果要直接查询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');
Run Code Online (Sandbox Code Playgroud)