Remove href-Tag von wp_postmeta in 34.000 Posts?

Ich benutze Godaddy Hosting, PHP 5 und WordPress 4.2.1

Ich habe 34.000 + Beiträge, die veraltete href-Tags entfernt haben. Ich kann Tags einzeln entfernen, indem ich diesen Code in einer Seitenvorlage verwende und die post_id manuell ändere. Danke @ialocin für den wp-kses-Zusatz. Die Tabelle wp_postmeta hat 347.602 Zeilen, aber nur 34.788 Zeilen haben die Zeile “simple_fields”.

 array(), 'img' => array( 'alt' => true, 'align' => true, 'border' => true, 'height' => true, 'hspace' => true, 'longdesc' => true, 'vspace' => true, 'src' => true, 'usemap' => true, 'width' => true, ), 'br' => array() ); ?>   

Allerdings muss ich dies auf viele tausend wp_postmeta-Zeilen anwenden. Nach dem Ändern dieses Beispiels von @TheDeadMedic konnte ich einen Fehler mit dem folgenden Code auslösen, aber bis jetzt tut es nichts für die database.

Der Fehler ist:

Schwerwiegender Fehler: Erlaubte Speichergröße von 67108864 Bytes erschöpft (versuchte, 32 Bytes zuzuordnen) in … / wp-includes / wp-db.php in Zeile 2204

Wenn ich die posts_per_page auf -1 ändere, scheint es nichts zu tun. Es aktualisiert nur die Seite.

  'ids', // MAGIC! Just get an array of id's, no objects committed to memory 'posts_per_page' => 500, // Batch size: look at all posts 'post_type' => 'post', 'date_query' => array( // Make sure the post is over 30 days old array( 'column' => 'post_date_gmt', 'before' => '1 month ago' ) ), ); $query = new WP_Query; $paged = 1; $count = 0; $total = null; do { $args['no_found_rows'] = isset( $total ); // No need to SQL_CALC_FOUND_ROWS on subsequent iterations $args['paged'] = $paged++; $post_ids = $query->query( $args ); update_postmeta_cache( $post_ids ); // Get all meta for this group of posts if ( ! isset( $total ) ) $total = $query->found_posts; $count += $query->post_count; foreach ( $post_ids as $post_id ) { $allowed_html = array( // Declare tags not to be removed 'p' => array(), 'img' => array( 'alt' => true, 'align' => true, 'border' => true, 'height' => true, 'hspace' => true, 'longdesc' => true, 'vspace' => true, 'src' => true, 'usemap' => true, 'width' => true, ), 'br' => array() ); $source = get_post_meta($post_id, '_simple_fields_fieldGroupID_1_fieldID_1_numInSet_0', true); update_post_meta($$post_id, '_simple_fields_fieldGroupID_1_fieldID_1_numInSet_0', wp_kses ($source, $allowed_html) ); } } while ( $count  

Kann jemand sehen, was aus ist oder fehlt? Sind die ‘Felder’ => ‘IDs’, // MAGIC! von @TheDeadMedic muss “post_id” sein oder muss dies eine foreach statt while oder andere sein?

Was ist der beste Weg, dies automatisch, dynamisch, verfahrenstechnisch, sonst weise oder anders zu tun?

Alle Lösungen, Hinweise, Anhaltspunkte oder Hinweise werden sehr geschätzt.

Solutions Collecting From Web of "Remove href-Tag von wp_postmeta in 34.000 Posts?"

Erstens würde ich in Betracht ziehen, eine von WordPress ‘ wp_kseswp_kses functionen anstelle von PHP’s strip_tags() .

Zweitens, WP_Query get_posts() Ihre Posts mit WP_Query oder get_posts() mit dem Parameter fields auf ” ids – scheint so, als ob Sie nicht mehr brauchen.

Drittens, teilen Sie Ihre Schleife in Schritte auf, die effektiv und überschaubar sind. Denn 34000+ Beiträge werden wahrscheinlich die Grenzen Ihres Servers erreichen – zumindest hinsichtlich der Verarbeitungszeit.

Sie könnten zum Beispiel die Parameter posts_per_page und / oder offset für WP_Query / get_posts WP_Query get_posts . Oder Sie können es tun, indem Sie das komplette Array von IDs posts_per_page , die Sie erhalten, indem Sie posts_per_page auf -1 posts_per_page mit PHP setzen. Für einen beispielhaften Ansatz sehen Sie sich die folgende Antwort von @TheDeadMedic zu einem ähnlichen Thema an.

Die schnellste Lösung ist die Export-Tabelle aus der database, ersetzen Sie Tags mit einem beliebigen Code-Editor. Für Beiträge Inhalt sind einfacher Text nicht serialisiert, auf diese Weise können Sie alle Ersatz in weniger als 10 Minuten ohne Probleme tun. Importieren Sie dann die SQL-Datei in db.

Vielen Dank

Der einfachste Weg dazu wäre via SQL. Nehmen Sie zunächst eine Sicherungskopie Ihrer database für den Fall, dass etwas schief geht. Führen Sie dann mit Hilfe von phpMyAdmin oder einem ähnlichen SQL-Frontend diesen SQL-Befehl aus:

 UPDATE wp_posts SET post_content = REPLACE(post_content, '
', '');

Dies wird das Tag ersetzen

 

mit nichts in allem Post Inhalt.

Wenn sich die Tags in Post-Meta- und nicht in Post-Inhalten befinden, ist es ein wenig mehr Arbeit, da Sie in Ihre database gehen müssen, um herauszufinden, in welchem ​​Metaschlüssel sich die Tags befinden.

Suchen Sie in Ihrer wp__postmeta-Tabelle nach dem Feld, das Sie oben in der Meta-Schlüsselspalte aufgelistet haben, und führen Sie diese SQL-Abfrage aus:

 UPDATE wp_postmeta WHERE meta_key = 'YourMetaKey' SET meta_value = REPLACE(meta_value, '
', '');

Führen Sie diese Befehle für jedes Tag aus, das Sie aus dem Post-Inhalt oder dem Post-Meta entfernen möchten.

Schließlich konnte ich alle 34.788 Einträge durchlaufen, aber nur, indem ich den Job in kleineren Batches basierend auf dem Post-Datum ausführte. Hier ist der letzte Code, den ich auf einer Seitenvorlage verwendet habe. Danke dir, @ialocin, dass du mich auf den richtigen Weg gebracht hast. Der Job ist erledigt, aber es muss einen besseren, automatischen Weg geben, die Posts zu durchlaufen, ohne das Veröffentlichungsdatum zu setzen oder den Speicher auszulöschen. Wenn Sie einen besseren Weg haben, bitte posten Sie es hier.

  < ?php /** * Remove href tags from postmeta by post date * */ $args = array( 'post_type' => 'post', 'fields' => 'ids', 'posts_per_page' => -1, // Grab all Post IDs 'date_query' => array( // Set the date range of the posts you want effected array( 'after' => 'June 1st, 2010', 'before' => array( 'year' => 2012, 'month' => 12, 'day' => 30, ), 'inclusive' => true, ), ), ); $query = new WP_Query($args); if ($query->have_posts()): foreach( $query->posts as $id ): $allowed_html = array( // Declare tags not to be removed 'p' => array(), 'img' => array( 'alt' => true, 'align' => true, 'border' => true, 'height' => true, 'hspace' => true, 'longdesc' => true, 'vspace' => true, 'src' => true, 'usemap' => true, 'width' => true, ), 'br' => array() ); // retrieve the postmeta for the specific custom field, only if it has data. $source = get_post_meta($id,'_simple_fields_fieldGroupID_1_fieldID_1_numInSet_0', true); // write it back, but remove the tags with wp_kses update_post_meta($id, '_simple_fields_fieldGroupID_1_fieldID_1_numInSet_0', wp_kses ($source, $allowed_html) ); // Wipe this post's meta from memory wp_cache_delete($id, 'post_meta' ); endforeach; endif; ?>