wp_set_object_terms und arrays

Ich muss etwa 2500 Posts eine Kategorie hinzufügen und entweder eine SQL-Abfrage oder wp_set_object_terms mit PHP verwenden. Ich schaue auf wp_set_object_terms damit ich eine Kategorie hinzufügen kann und die aktuell zugewiesenen Kategorien nicht beeinflusst.

Die folgende function, die wp_set_object_terms' (aus dem WordPress-Codex) verwendet, fügt eine oder mehrere Kategorien von einem Array (im Beispiel Kategorien 6 und 8) zum Post mit der ID 42 (im Beispiel) hinzu.

Aber ich muss in der Lage sein, ein Array von Post-IDs ( $object_id ) hinzuzufügen, nicht ein Array von Kategorien.

Gemäß https://codex.wordpress.org/Function_Reference/wp_set_object_terms muss $object_id eine einzelne ganze Zahl sein.

Wie kann ich ein Array von ~ 2500 Post-IDs für $object_id ? Muss ich für jede Schleife eine Schleife durchlaufen und durch das Array laufen und jede Kategorie-Addition für jede Post-ID einzeln verarbeiten?

Von https://codex.wordpress.org/Function_Reference/wp_set_object_terms :

 // An array of IDs of categories we to add to this post. (Not using an array) $cat_ids = array( 6, 8 ); // Add these categories, note the last argument is true. // (42 is the $object_id; I will hardcode the category ID) $term_taxonomy_ids = wp_set_object_terms( 42, $cat_ids, 'category', true ); if ( is_wp_error( $term_taxonomy_ids ) ) { // There was an error somewhere and the terms couldn't be set. } else { // Success! These categories were added to the post. } 

Solutions Collecting From Web of "wp_set_object_terms und arrays"

Ich bezweifle, dass es den Aufwand rechtfertigen würde, benutzerdefinierte SQL-Abfragen für nur 2500 Posts zu schreiben.

Innerhalb der function wp_set_object_terms( $object_id, ... ) haben wir:

 $object_id = (int) $object_id; 

also ist es richtig, dass es nur eine einzige Post-ID als Eingabe benötigt.

Sie müssten also Ihr $post_ids Array $post_ids aber es könnte ausreichen, den wp_defer_term_counting() 1) zu verwenden :

 /** * Add terms to posts (with debug display) */ function wpse_terms_to_posts( $terms, $taxonomy, $append, &$post_ids ) { wp_defer_term_counting( true ); print '
    '; foreach( (array) $post_ids as $post_id ) { $tt_ids = wp_set_object_terms( $post_id, $terms, $taxonomy, $append ); print '
  • '; if( is_wp_error( $tt_ids ) ) printf( 'Problem adding terms to post_id: %d - Error: %s', $post_id, $tt_ids->get_error_message() ); else print 'Success adding terms to post_id: ' . $post_id ; print '
  • '; } print '
'; wp_defer_term_counting( false ); }

Hier übergeben wir $post_ids Referenz, falls es sehr groß ist.

Verwendung (PHP 5.4+):

 wpse_terms_to_posts( $terms = [ 6, 8 ], $taxonomy = 'category', $append = true, $post_ids = [ 123, 234, 345 ] ); 

Wir könnten sogar das $post_ids Array $post_ids , wenn 2500 in einem einzigen Durchlauf zu viel für unser System ist.

Hier ist ein Beispiel, wie wir die function mit admin-ajax.php mit einer solchen Slicing- function admin-ajax.php :

Wir schaffen unsere eigene Aktion mit:

 /** * Custom wp ajax action to activate our wpse_terms_to_posts() function * * Example: /wp-admin/admin-ajax.php * ?action=wpse-terms-to-posts&wpse_offset=0&wpse_length=500 */ add_action( 'wp_ajax_wpse-terms-to-posts', function() { $offset = filter_input( INPUT_GET, 'wpse_offset', FILTER_SANITIZE_NUMBER_INT ); $length = filter_input( INPUT_GET, 'wpse_length', FILTER_SANITIZE_NUMBER_INT ); // Check for user capability and non empty user input: if( current_user_can( 'manage_options' ) && '' !== $offset && '' !== $length ) { print '

Start:

'; $start = microtime( true ); // Settings - Edit to your needs: $terms = [ 6, 8 ]; $taxonomy = 'category'; $append = true; $post_ids = [ 123, 234, 345, 456, 567, 678, 789 ]; // Add terms to posts: wpse_terms_to_posts ( $terms, $taxonomy, $append, array_slice( $post_ids, $offset, $length ) ); printf( '

Done in %f seconds

', microtime( true ) - $start ); exit(); } } );

Hier verwenden wir die Parameter GET des Parameters wpse_offset und wpse_length , um das Posts-Array zu wpse_length .

Wenn wir das Post-IDs-Array in Stücke von 500 teilen wollen, können wir es manuell aktivieren mit:

 /wp-admin/admin-ajax.php?action=wpse-terms-to-posts&wpse_offset=0&wpse_length=500 /wp-admin/admin-ajax.php?action=wpse-terms-to-posts&wpse_offset=500&wpse_length=500 /wp-admin/admin-ajax.php?action=wpse-terms-to-posts&wpse_offset=1000&wpse_length=500 /wp-admin/admin-ajax.php?action=wpse-terms-to-posts&wpse_offset=1500&wpse_length=500 /wp-admin/admin-ajax.php?action=wpse-terms-to-posts&wpse_offset=2000&wpse_length=500 

Auf diese Weise können wir nach möglichen Fehlern suchen.

Hoffe, Sie können dies an Ihre Bedürfnisse anpassen.

1) wp_defer_term_counting() wurde zuerst in dieser Antwort von @JanFabry auf WPSE erwähnt