更换岗位弹头但保留旧岗位

时间:2015-04-12 作者:Sibul

我的网站上有数千篇帖子是自动创建的。其中一些有重复的标题。我想在它们的slug中添加一些关键字,这样URL

domain.com/post-title/
domain.com/post-title-2/ 
成为

domain.com/post-title-some-keywords/
domain.com/post-title-2-some-other-keywords/
我可以使用wp_update_post 函数,通常为URLdomain.com/post-title-2/ 将自动重定向到domain.com/post-title-2-some-other-keywords/. 然而,如果我添加了一个标题相同的新帖子,它的URL将是domain.com/post-title-2/ (因为旧的已经不存在了)而重定向也不再有效。

如何避免这种情况?

我想要一个新帖子有URLdomain.com/post-title-3/, 尽管domain.com/post-title-2/ 可用。除了在单独的表格中保存旧的Slug,还有其他选择吗?

Update: 我知道老鼻涕虫被关在里面wp_postmeta, 但这无助于解决重定向问题。

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

这可能会有一些怪癖,但实际上它会满足您的需求。请注意,它设置为仅适用于帖子(不适用于页面或自定义帖子类型)。

我们所做的就是使用wp_unique_post_slug 过滤器,在WordPress生成自己独特的slug后运行,并根据所有_wp_old_slug 元值。您将在我的自定义查询中看到,我仍然在主posts表中对照slug进行检查-如果没有它,我们可能会“重置”后缀计数,并与现有post发生冲突。

function wpse_183975_unique_post_slug( $slug, $post_id, $post_status, $post_type ) {
    if ( $post_status === \'publish\' && $post_type === \'post\' ) {
        global $wpdb;

        if ( preg_match( \'/-([0-9]+)$/\', $slug, $match ) ) { // Already has a number suffix
            $slug_base = substr( $slug, 0, -strlen( $match[0] ) ); // Strip suffix from slug
            $i = ( int ) $match[1];
        } else { // No suffix, start at 1
            $slug_base = $slug;
            $i = 1;
        }

        while ( // For as long as there is an existing slug, increment the suffix
            $wpdb->get_var(
                $wpdb->prepare(
                    "SELECT m.post_id FROM $wpdb->postmeta AS m INNER JOIN $wpdb->posts AS p ON m.post_id = p.ID " .
                    "WHERE " .
                        "p.ID != %d AND " .
                        "p.post_type = \'post\' AND " .
                        "( p.post_status = \'publish\' AND p.post_name = %s ) OR " .
                        "( m.meta_key = \'_wp_old_slug\' AND m.meta_value = %s ) " .
                    "LIMIT 1",
                    $post_id,
                    $slug,
                    $slug
                )
            )
        ) {
            $slug = "$slug_base-" . ++$i;
        }
    }

    return $slug;
}

add_filter( \'wp_unique_post_slug\', \'wpse_183975_unique_post_slug\', 10, 4 );

结束

相关推荐

Unwanted slug in my website

有一个不需要的鼻涕虫/question/ 在我的WordPress网站上。段塞自动更改为/question/ 当我打开许多页面时。我已经彻底检查了我的phpMyAdmin,我没有/question/ 我的网站上的slug。我的.htaccess 除了标准代码之外,没有其他东西。虽然我有一个自定义的帖子类型/questions/ 但这似乎确实是个问题。这很烦人,因为当我打开我的自定义登录页面时www.ideabroad.com/sign-in/, 它也更改为www.ideabroad.com/questio