2010-09-28 5 views
10

En nuestra instalación multi-sitio de Wordpress 3.0, tenemos una opción personalizada para todos nuestros blogs llamada algo así como 'plataforma'. Los administradores pueden ingresar un valor para esta plataforma al crear o editar un blog. Algunos blogs pueden no tener plataforma.¿Cómo puedo consultar de forma simultánea todas las tablas de opciones del blog en una instalación multisitio de Wordpress (3.0)?

Necesitamos poder crear una lista de todas las plataformas y sus blogs asociados. El problema es que creamos y eliminamos dinámicamente blogs a través de otros mecanismos de sitio, por lo que tenemos muchas tablas de opciones de blog con números que no son necesariamente contiguos. (es decir, wp_2_options, wp_4_options, wp_12_options, etc.)

Mi pregunta es esta, ¿hay alguna manera en Wordpress de obtener una opción en todos los blogs? Por el contrario, ¿hay una consulta que podría ejecutar que haría esto manualmente? He intentado algo como esto a ningún efecto:

SELECT * FROM (SELECT nombre_tabla DE INFORMATION_SCHEMA.TABLES DONDE nombre_tabla como 'wp _% _ opciones') como t DONDE option_name = 'plataforma'

¿Tiene sentido lo que estoy tratando de hacer? Una vez más, me disculpo por mi falta de conocimiento de MySql, pero no he podido encontrar ninguna respuesta sobre cómo hacer esto. También podría consultar todos estos nombres de tabla primero, y luego consultar cada tabla por separado, pero eso no es realmente una opción porque tenemos muchos blogs, y es posible que tengamos que ejecutar esta consulta para muchas solicitudes de página simultáneamente, y esto sería agregar cientos de consultas a cada una de estas solicitudes.

Cualquier consejo o ayuda que pudieran dar sería muy apreciado.

Respuesta

4

Si desea consultar directamente la base de datos MySQL, se puede crear un procedimiento y utilizarla:

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'); 
7

En caso de que alguien esté interesado, terminé haciéndolo así (pero aún me gustaría saber si es posible hacer una búsqueda de nombres de tablas usando LIKE y luego consultar esas tablas, si alguien sabe).

// 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); 
+0

gracias por esto. ¿sabes cómo puedes consultar múltiples opciones? – Alex

+0

Hmmm, creo que todo lo que tendría que hacer es cambiar la cláusula WHERE de sus consultas internas. Algo así como: "... WHERE option_name = '$ option_name1' O option_name = '$ option_name2'"; ... También podría usar MYSQL IN clase "... WHERE option_name IN ('$ option_name1', '$ option_name2')" Espero que ayude! –

Cuestiones relacionadas