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

Posted

技术标签:

【中文标题】如何在 Wordpress 多站点安装 (3.0) 中同时查询所有博客选项表?【英文标题】:How can I simultaneously query all blog options table in a Wordpress multisite installation (3.0)? 【发布时间】:2011-04-18 13:37:42 【问题描述】:

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

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

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

选择 * 从 (选择表名 FROM information_schema.tables WHERE table_name like 'wp_%_options') as t WHERE option_name='平台'

我正在尝试做的事情有意义吗?再次,我为我缺乏 mysql 知识而道歉,但我无法找到任何关于如何做到这一点的答案。我也可以先查询所有这些表名,然后分别查询每个表,但这不是一个真正的选择,因为我们有很多博客,我们可能需要同时为许多页面请求运行此查询,这将添加数百个对每个请求的查询。

如果你们能提供任何建议或帮助,我们将不胜感激。

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢您。你知道如何查询多个选项吗? 嗯,我相信您需要做的就是更改内部查询的 WHERE 子句。类似于:“...WHERE option_name='$option_name1' OR option_name='$option_name2'”; ...您也可以使用 MYSQL IN clase "...WHERE option_name IN ('$option_name1', '$option_name2')" 希望对您有所帮助!【参考方案2】:

如果你想直接查询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');

【讨论】:

以上是关于如何在 Wordpress 多站点安装 (3.0) 中同时查询所有博客选项表?的主要内容,如果未能解决你的问题,请参考以下文章

使用非 www 域安装 Plesk WordPress 多站点

如何为自己的WordPress站点安装SSL证书开启https访问

Nginx 中的多站点 WordPress 重写规则

如何为自己的WordPress站点安装SSL证书开启https访问

Wordpress 多站点错误

如何为自己的WordPress站点安装SSL证书开启https访问