我怀疑这是否能证明只为2500篇文章编写自定义SQL查询的努力是合理的。
在wp_set_object_terms( $object_id, ... )
我们拥有的功能:
$object_id = (int) $object_id;
因此,它只接受一个post id作为输入是正确的。
所以你需要在你的$post_ids
数组,但使用wp_defer_term_counting()
技巧1):
/**
* Add terms to posts (with debug display)
*/
function wpse_terms_to_posts( $terms, $taxonomy, $append, &$post_ids )
{
wp_defer_term_counting( true );
print \'<ul>\';
foreach( (array) $post_ids as $post_id )
{
$tt_ids = wp_set_object_terms( $post_id, $terms, $taxonomy, $append );
print \'<li>\';
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 \'</li>\';
}
print \'</ul>\';
wp_defer_term_counting( false );
}
我们过去了
$post_ids
如果它非常大,请参考。
Usage (PHP 5.4+) :
wpse_terms_to_posts(
$terms = [ 6, 8 ],
$taxonomy = \'category\',
$append = true,
$post_ids = [ 123, 234, 345 ]
);
我们甚至可以把
$post_ids
阵列,如果2500对于我们的系统来说在一次运行中太多。
下面是一个示例,我们可以使用admin-ajax.php
使用这种切片功能:
我们通过以下方式创建自己的行动:
/**
* 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 \'<h3>Start:</h3>\';
$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( \'<h3>Done in %f seconds</h3>\', microtime( true ) - $start );
exit();
}
} );
我们使用
wpse_offset
和
wpse_length
获取参数以分割posts数组。
如果要将post ids数组分为500块,可以使用以下方法手动激活它:
/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
这样我们就可以检查任何术语错误。
希望您可以根据自己的需要进行修改。
1)wp_defer_term_counting()
首次在WPSE中提到answer 作者@JanFabry