WP_SET_OBJECT_Terms和数组

时间:2015-06-21 作者:markratledge

我需要为大约2500篇文章添加一个类别,或者需要使用SQL查询,或者wp_set_object_terms 使用PHP。我在看wp_set_object_terms 因此,我可以添加一个类别,而不会影响当前分配的类别。

下面使用的函数wp_set_object_terms\' (来自WordPress Codex)将数组中的一个或多个类别(在示例中为类别6和8)添加到ID为42的帖子(在示例中)。

但我需要能够添加一个post id数组($object_id), 不是类别数组。

根据https://codex.wordpress.org/Function_Reference/wp_set_object_terms, $object_id 必须是单个整数。

如何使用约2500个post ID的数组$object_id? 我是否需要一个for each循环,遍历数组,一次一个地处理每个post ID中添加的每个类别?

从…起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.
}

1 个回复
SO网友:birgire

我怀疑这是否能证明只为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_offsetwpse_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

结束

相关推荐

从phpMyAdmin创建新用户

我正在尝试将我在免费web托管服务器中创建的站点复制到我在WAMP上运行WP的windows pc上。我复制了所有文件,但采用了wp配置。php来自我在PC上运行的示例站点,并对其中的db连接进行了一些修改。复制的网站以某种方式在我的电脑上运行,但现在我需要访问wp管理员。我不知道为什么我不能用用户名登录并通过,这在免费主机中非常有效。我决定从phpMyAdmin页面创建新用户。但如何处理密码生成?系统对空的那个感到愤怒。如果我从PC上运行的另一个站点导出用户并导入到当前表(wp\\U users),则无