从帖子标题重新生成弹头

时间:2012-03-19 作者:Nicola Peluchetti

在更改文章标题后,是否可以通过编程重新生成slug?许多帖子标题都被更新了,而slug没有用标题更新,所以我需要重新生成所有这些slug。

5 个回复
最合适的回答,由SO网友:fuxia 整理而成

是的,这是可能的。

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

// 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案例,但它应该给你一个想法。此外,这可能需要一段时间,因此将更新拆分为较小的块可能很有用。

SO网友:Lessan Vaezi

此插件还可以完成以下工作:http://www.jerrytravis.com/598/wordpress-plugin-to-generate-post-slugs

但是,由于它仅适用于尚未生成slug的帖子,如果需要重新生成slug,请在插件中编辑以下行:

if ($post->post_name == "") {

例如,您可以将其更改为:

if (true) {

SO网友:Alexandre Bourlier

我尝试了Toscho建议的方法,这是一种“本能的方法”,但在许多情况下它都不起作用(参见核心代码,以了解我所说的“许多情况”)。

查看代码,我发现wp_insert_post_data 过滤器挂钩,由wp_update_post 在将post IU插入数据库之前立即运行。

通过调用此筛选器,并更改$data[\'post_name\'], 我能让它正常工作。Wordpress很酷,但文档记录很差。。。

I edited the documentation, 这样,如果需要,更多的人可以找到这种解决方法。

SO网友:iateadonut

如果需要,可以直接在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\\u type=“product”-这将使您只更新woocommerce产品;您应该弄清楚要对此查询保持什么限制。

SO网友:John Ouellet

我们遇到了一个问题,我们迁移并合并了一组帖子类型。我们也有一些空白标题。我编写了一个WP CLI命令来修复所有这些问题,但下面是我所做工作的要点:

    global $wpdb;
    $types = [
      \'page\',
      // Your CPT machine names
    ];

    // Formats our IN query properly.
    $final = array_map(function($type) {
      return "\'" . esc_sql($type) . "\'";
    }, $types);

    // Grabs all our empty title fields.
    $query = sprintf("SELECT post_title, ID FROM `%s` WHERE post_type IN (%s) AND post_name = \'\'",
      $wpdb->posts,
      implode(",", $final)
    );

    foreach ($wpdb->get_results($query) as $post) {
      $title = sanitize_title_with_dashes( $post->post_title );
      $wpdb->update(\'wp_posts\', [\'post_name\' => $title], [\'ID\' => $post->ID]);
    }
需要执行直接MySQL更新,因为wp\\u update\\u post不会更新post\\u名称。

结束