从帖子标题再生弹头


14

更改帖子标题后,是否可以通过编程方式重新生成子弹?许多帖子标题已更新,而子弹头的标题未更新,因此我需要重新生成所有这些子弹头。


我不得不这样做几次,发现在不同的服务器环境之间,它无法处理大型数组(将numberposts设置为unlimited),也无法重复调用wp_update_post且占用大量内存,这使其分页并使用WP_Query调用$ wpdb,它更易于管理和执行。我在类似的文章中提供了代码示例
codearachnid 2014年

Answers:


17

对的,这是可能的。

示例代码必须经过测试和完善:

// get all posts
$posts = get_posts( array (  'numberposts' => -1 ) );

foreach ( $posts as $post )
{
    // check the slug and run an update if necessary 
    $new_slug = sanitize_title( $post->post_title );
    if ( $post->post_name != $new_slug )
    {
        wp_update_post(
            array (
                'ID'        => $post->ID,
                'post_name' => $new_slug
            )
        );
    }
}

我只是编造的,可能有一些错误和egde案例,但这应该可以给您一个思路。另外,这可能需要一段时间,因此将更新分成较小的块可能很有用。


1
嗯...根据我的经验,这行不通。该post_name说法被忽略wp_update_post在3.9版本的核心,至少
亚历山大Bourlier

当前,post_namewp_update_post()函数内将其忽略,但是在更新帖子调用该wp_insert_post()函数时会予以考虑:这意味着将新的块传递给更新,将导致有效地更改要更新的帖子。
Erenor Paz


1

我正在尝试Toscho建议的方法,这是“本能的方法”,但是在许多情况下,它是行不通的(请参阅核心代码,以了解“很多情况”的含义)。

在代码中,我发现了wp_insert_post_data过滤器挂钩,该wp_update_post函数在将帖子插入数据库之前被函数调用。

通过调用此过滤器并更改的值$data['post_name'],我可以使其正常工作。WordPress很酷,但是文档记录很差。

我编辑了文档,以便更多的人可以在需要时找到此解决方法。


您能指出为什么wp_update_post覆盖post_name吗?我看到发生这种情况的唯一原因是,如果尝试修改post_name的用户只是贡献者(或相同级别),在这种情况下,该用户不应更改该子弹,是否发现了其他情况, post_name是否被覆盖?
jnhghy-Alexandru Jantea 2014年

是的,这是正确的方法。谢谢@Alexandre
user88731

-1

您可以根据需要直接在mysql中执行此操作。(我们的woocommerce网站拥有成千上万种产品):

update wp_posts set post_name = concat(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(lower(post_title), '"', ''), "'", ''), ",", '-'), " ", '-'), "&", ''), ";", ''), "@", ''), ".", ''), ":", ''), "/", ''), "+", ''), "(", ''), ")", ''), "--", '-'), "---", '-'), "--", '-'), "--", '-'), '-', id) where post_type = 'product';

其中post_type ='product'-将使您仅对woocommerce产品进行更新;您应该确定要对该查询保留的限制。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.