2010-09-28 6 views
10

In unserer Wordpress 3.0 Multi-Site-Installation haben wir eine benutzerdefinierte Option für alle unsere Blogs namens "Plattform". Administratoren können einen Wert für diese Plattform eingeben, wenn sie ein Blog erstellen oder bearbeiten. Einige Blogs haben möglicherweise keine Plattform.Wie kann ich gleichzeitig alle Blog-Optionen in einer Wordpress Multisite-Installation (3.0) abfragen?

Wir müssen in der Lage sein, eine Liste aller Plattformen und ihrer zugehörigen Blogs zu erstellen. Das Problem ist, dass wir Blogs dynamisch über andere Site-Mechanismen erstellen und löschen. Daher haben wir viele Blog-Optionstabellen mit Nummern, die nicht unbedingt zusammenhängend sind. (zB wp_2_options, wp_4_options, wp_12_options, etc.)

Meine Frage ist das, gibt es einen Weg in Wordpress eine Option über alle Blogs zu ergattern? Gibt es umgekehrt eine Abfrage, die ich manuell ausführen könnte? Ich habe so etwas wie dies zu keinem Effekt versucht:

SELECT * FROM (SELECT table_name VON INFORMATION_SCHEMA.TABLES WHERE table_name wie 'wp _% _ Optionen') als t WHERE option_name = 'Plattform'

Macht es Sinn, was ich zu tun versuche? Nochmals, ich entschuldige mich für mein fehlendes MySql-Wissen, aber ich konnte keine Antworten darüber finden, wie das geht. Ich könnte auch alle diese Tabellennamen zuerst abfragen und dann jede Tabelle einzeln abfragen, aber das ist nicht wirklich eine Option, weil wir viele Blogs haben, und wir müssen diese Abfrage für viele Seitenanforderungen gleichzeitig ausführen, und dies würde Hunderte von hinzufügen Anfragen an jede dieser Anfragen.

Jeder Rat oder Hilfe, die Sie geben könnten, würde sehr geschätzt werden.

Antwort

4

Wenn Sie direkt MySQL-Datenbank abfragen möchten, können Sie eine Prozedur erstellen und verwenden es:

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

Falls jemand interessiert ist, habe ich es so gemacht (aber ich würde immer noch gerne wissen, ob es möglich ist, mit LIKE nach Tabellennamen zu suchen und dann diese Tabellen abzufragen, wenn jemand weiß).

// 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

Dank. Wissen Sie, wie Sie mehrere Optionen abfragen können? – Alex

+0

Hmmm, ich glaube, Sie müssten nur die WHERE-Klausel Ihrer inneren Abfragen ändern. Etwas wie: "... WHERE option_name = '$ option_name1' ODER option_name = '$ option_name2'"; ... Sie könnten auch MYSQL IN clase "... WHERE option_name IN ('$ option_name1', '$ option_name2')" Ich hoffe, das hilft! –

Verwandte Themen