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

February 2 2012, 4:23am

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 ;

Your favourite external commenting service goes here! I recommend http://www.disqus.com