Reslug a Custom Post Type

时间:2014-02-25 作者:Rizzo

我为wordpress构建了一个带有自定义帖子类型的插件,在此过程中,我意识到我必须重新构建生成slug的方式。最初,我让cpt制作默认的slug,如new-post-1、new-post-2等。我意识到这很愚蠢,于是重新编写了命名约定,按照应该的方式从帖子标题创建slug。我现在唯一的问题是,我想让我在wordpress中输入的所有旧帖子都使用新的命名约定。是否有一个函数或方法可以告诉wordpress为特定的自定义帖子类型重建/重新生成slug。

我找到了这个插件:http://wordpress.org/plugins/re-slug/

但是它不适用于CPT

谢谢你的帮助。

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

我还创建了一个类似的方法,正如@sri所提到的,但是使用$wpdb与wp\\u update\\u post应该更具性能和可配置性。

/**
 * Reset the slugs on a particular post type to use the default sanatized slugs
 * @param  string  $post_type         filter by post type
 * @param  int $offset                set the paginated post to start
 * @param  boolean $force_guid_update * WARNING * never enable this
 *
 * @example add the following code into your theme\'s functions.php file, ensure
 * that the desired post type is set when calling wp20140226_reset_slugs(\'post\');
 * Then navigate to wp-admin/options-permalink.php to activate query to reset slugs.
 * Depending on how many posts need to be updated this method may take quite 
 * some time, on a shared host there may be a need to set the $offset argument
 * to limit the amount of time the script runs and use multiple calls by adjusting
 * the offset to progress through the entire record set.
 * 
 */
function wp20140226_reset_slugs( $post_type = null, $offset = 0, $force_guid_update = false ){
    global $pagenow, $wpdb;

    if ( $pagenow != \'options-permalink.php\' || empty($post_type) )
        return;

    $get_post_args = array(
        \'post_type\' => $post_type, 
        \'post_status\' => \'any\'
        );

    if( $offset == 0 ){
        $get_post_args[\'posts_per_page\'] = -1;
    } else {
        $get_post_args[\'offset\'] = $offset;
    }

    $posts_to_fix = new WP_Query( $get_post_args );

    foreach( $posts_to_fix->posts as $post_to_fix ){
        $wpdb->update( 
            $wpdb->posts, 
            array( \'post_name\' => sanitize_title( $post_to_fix->post_title ) ), 
            array( \'ID\' => $post_to_fix->ID ), 
            array( \'%s\' ), 
            array( \'%d\' ) 
        );
    }

    // you should really leave this alone (do not set to true unless you need to)
    //http://codex.wordpress.org/Changing_The_Site_URL#Important_GUID_Note
    if( $force_guid_update ){
        $siteurl = trailingslashit( get_option(\'siteurl\') );
        $wpdb->query( "UPDATE {$wpdb->posts} SET guid = CONCAT( \'{$siteurl}?p=\', ID ) WHERE post_type = {$post_type} OR post_type = \'revision\';" );
    }

    add_action(\'admin_notices\', \'wp20140226_reset_slugs_admin_notice\');

}

/**
 * notify the user when the reset slug queries are run
 */
function wp20140226_reset_slugs_admin_notice(){
    ?>
    <div class="updated">
        <p><?php _e(\'You have successfully run the reset slugs function, please disable or suffer impact when in the admin.\'); ?></p>
    </div>
    <?php
}

wp20140226_reset_slugs(\'post\'); // change this to be your custom post type
资料来源:https://gist.github.com/codearachnid/9243595

SO网友:Slam

re-slug插件可以修复为与Wordpress 4及更高版本一起使用。编辑re slug的第13行。php阅读:

$return = str_replace(\'Edit</button>\', \'Edit</button> <button type="button" id="re-slug" class="edit-slug button button-small hide-if-no-js" style="display:inherit;"><a href="#re-slug">Re-slug</a></button>\', $return);

我的修复不是很干净,但对于第一次通过,它工作得足够好,包括自定义帖子类型。添加按钮后,当前帖子可以用标题字段中的任何内容重新拖拽。

这是我为一篇文章找到的唯一解决方案。

结束

相关推荐

如果Slug与自定义帖子标题不同,则表单操作不起作用

我面临以下情况,我创建了一个事件自定义帖子类型,并用单个事件显示这些帖子。php模板。我还在该模板中实现了一个注册表单,一切都很好。然而,我注意到,当事件的标题(而不是slug)发生更改时,提交表单将导致404(或者在我的情况下,通知找不到博客帖子)。解决方法是根据标题相应地更改slug,但我注意到这并不总是有效,尤其是当他们放置多个。。。例如,在标题中。我似乎不知道哪里出了错,这让我抓狂:(你们中的一个如何向我指出解决这个问题的正确方向:D这是我自定义帖子类型的代码/** * Flushes