WordPressのBlog Optionをまとめて取得する

WordPressをマルチサイトで動かしていると、wp_optionsテーブルがブログ単位で作成されるので、まとめて設定内容を確認したいときに、めっさ面倒くさい。なので、まとめて設定値を取得できるストアドプロシージャを書いてみました。
call sp_get_blog_options(‘dbname’, ‘option_name’, 0);
引数は
1)データベース名
2)取得したいoption_name値
3)group byするかどうかフラグ(0=しない,1=する)
の3つです。
ブログで使われているブログテンプレートを集計したい場合は
call sp_get_blog_options(‘wordpress’, ‘template’, 1);
とすれば、各テンプレートの利用数を取得できます。最後の引数を0にするとblog_idとoptions_valueをそのままダンプします。
PHPで呼び出す場合は$wpdb->get_results()やmysql_query()ではエラーになるので注意してください。呼び出す場合はmysqli_query()で。あと、information_schemaにアクセスできるDBアカウントで実行するのもお忘れ無く。


DELIMITER $$
DROP PROCEDURE IF EXISTS `sp_get_blog_options` $$
CREATE PROCEDURE `sp_get_blog_options`(
IN db_name varchar(100),
IN option_value varchar(100),
IN summary_flag int
)
BEGIN
DECLARE not_found int DEFAULT 0;
DECLARE _blog_id bigint(20);
DECLARE _table_name varchar(100);
DECLARE _get_table_name varchar(100);
DECLARE cur CURSOR FOR SELECT blog_id FROM wp_blogs WHERE spam <> 1;
DECLARE cur2 CURSOR FOR SELECT table_name FROM `information_schema`.`tables` WHERE `table_name` = _table_name AND `table_schema` = db_name;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET not_found = 1;
DROP TABLE IF EXISTS `tmp_options`;
CREATE TEMPORARY TABLE `tmp_options` (`blog_id` bigint(20), `option_value` varchar(50));
OPEN cur;
loop1: LOOP
FETCH cur INTO _blog_id;
IF not_found THEN
CLOSE cur;
LEAVE loop1;
END IF;
OPEN cur2;
SET _table_name = CONCAT('wp_', _blog_id, '_options');
FETCH cur2 INTO _get_table_name;
IF not_found THEN
SET not_found = 0;
ELSE
SET @s = CONCAT('SELECT option_value INTO @option_value FROM `wp_', _blog_id, '_options` WHERE option_name=?');
PREPARE stmt FROM @s;
SET @val = option_value;
EXECUTE stmt USING @val;
DEALLOCATE PREPARE stmt;
INSERT INTO tmp_options VALUES (_blog_id, @option_value);
END IF;
CLOSE cur2;
END LOOP;
IF summary_flag THEN
SELECT tmp_options.option_value, count(tmp_options.option_value) AS counter FROM tmp_options GROUP BY tmp_options.option_value ORDER BY count(tmp_options.option_value);
ELSE
SELECT * FROM tmp_options;
END IF;
END $$
DELIMITER ;

コメント

タイトルとURLをコピーしました