it-swarm.com.de

Helfen Sie beim Ausführen einer MySQL-Abfrage, um alle wp _ # _ -Optionenstabellen in einer Multisite-Installation zu aktualisieren

Ich möchte eine Abfrage in meiner WordPress-Datenbank ausführen, mit der die blog_public-Werte auf allen einzelnen Websites aktualisiert werden. Ich bin nicht sicher, wie die Anweisung nach wp_2_options, wp_3_options usw. aussehen soll.

Ich kann es individuell mit so etwas machen:

UPDATE wp_10_options
SET option_value = REPLACE(option_value, '1', '0')

Aber ich bin nicht sicher, wie ich eine Abfrage ausführen soll, die alle Tabellen abdeckt. Irgendeine Hilfe?

Danke im Voraus :)

2
Mason James

Hierfür gibt es aus Datenbanksicht wahrscheinlich viele Ansätze ... Wenn dies jedoch nur einmal durchgeführt werden muss und die WP APIs eingehalten werden:

  • mache ein einfaches Plugin daraus
  • platzieren Sie Ihren Ersatz in der Aktivierungsroutine
  • netzwerkaktivierung (nur ich erinnere mich nicht, ob Sie noch Dashboards besuchen müssen, um Websites zu aktivieren, die ausgelöst werden sollen oder die behoben wurden)
1
Rarst

Ich habe eine Teillösung, aber es ist erforderlich, dass VPS sie ausführt, da Shared Hosting die Möglichkeiten eines Cursors einschränkt.

Sowieso,

DROP PROCEDURE IF EXISTS `update_all_options`;
DELIMITER //
CREATE PROCEDURE update_all_options(
IN db varchar(255),
IN theoption varchar(255),
IN set_val VARCHAR(255)
)
BEGIN
DECLARE table_val VARCHAR(255);

-- Declare variables used just for cursor and loop control
DECLARE no_more_rows BOOLEAN;

-- Declare the cursor
DECLARE options_cur CURSOR FOR SELECT table_name FROM information_schema.tables WHERE TABLE_SCHEMA = db AND TABLE_NAME LIKE 'wp_%options';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = TRUE;

OPEN options_cur;

the_loop: LOOP

FETCH options_cur
INTO table_val;

IF no_more_rows THEN
CLOSE options_cur;
LEAVE the_loop;
END IF;

SET @qry = CONCAT('UPDATE ', table_val, ' SET option_value = "', set_val, '" WHERE option_name = "', theoption, '"');
PREPARE sqlstatement FROM @qry;
EXECUTE sqlstatement;
DEALLOCATE PREPARE sqlstatement;

END LOOP the_loop;

END //
DELIMITER ;

Sie führen es in Ihrem SQL-Abfragefenster aus, um die Prozedur zu erstellen. Es bleibt dann so lange bestehen, bis Sie es brauchen. Um es zu benutzen, mache:

CALL update_all_options('wpglobal', 'blog_public', '1');

Alle Optionen mit dem Namen blog_public in der wpglobal-Datenbank auf 1 zu ändern. PHP wäre wahrscheinlich viel einfacher, was? Oder sagen Sie so meine Kollegen, die sich das oben Genannte ausgedacht haben :)

1
Mason James