Wie kann ich in einer WordPress-Multisite-Installation (3.0) alle Blog-Optionstabellen gleichzeitig abfragen?

Lesezeit: 3 Minuten

Benutzeravatar von Michael Henretty
Michael Henretty

In unserer Multi-Site-Installation von WordPress 3.0 haben wir eine benutzerdefinierte Option für alle unsere Blogs, die so etwas wie „Plattform“ genannt wird. Administratoren können beim Erstellen oder Bearbeiten eines Blogs einen Wert für diese Plattform eingeben. Einige Blogs haben möglicherweise keine Plattform.

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

Meine Frage lautet: Gibt es in WordPress eine Möglichkeit, eine Option für alle Blogs zu nutzen? Gibt es umgekehrt eine Abfrage, die ich ausführen könnte, die dies manuell tun würde? Ich habe so etwas ohne Erfolg versucht:

SELECT * FROM (SELECT table_name FROM information_schema.tables WHERE table_name like ‘wp_%_options’) as t WHERE option_name=”platform”

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

Jeder Rat oder jede Hilfe, die ihr geben könntet, wäre sehr dankbar.

Falls es jemanden interessiert, ich habe es so gemacht (aber ich würde trotzdem gerne wissen, ob es möglich ist, mit LIKE nach Tabellennamen zu suchen und diese Tabellen dann abzufragen, falls es 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);

  • Danke dafür. Wissen Sie, wie Sie mehrere Optionen abfragen können?

    – Alex

    16. Januar 2011 um 5:45 Uhr

  • Hmmm, ich glaube, alles, was Sie tun müssten, ist die WHERE-Klausel Ihrer inneren Abfragen zu ändern. Etwas wie: “…WHERE option_name=’$option_name1′ OR option_name=’$option_name2′”; … Sie könnten auch die MYSQL IN-Klasse “…WHERE option_name IN (‘$option_name1’, ‘$option_name2’)” verwenden. Hoffe, das hilft!

    – Michael Henretty

    19. Januar 2011 um 22:05 Uhr


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

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

1397860cookie-checkWie kann ich in einer WordPress-Multisite-Installation (3.0) alle Blog-Optionstabellen gleichzeitig abfragen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy