如何在 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访问