我创建了一个自定义帖子类型,称为“ portfolio”,但我想将其更改为“ projects”。为了安全地更改名称并防止自定义帖子类型的帖子在仪表板上消失,我需要采取哪些确切的步骤?

注意:portfolio中已经有帖子了,我可以只需将portfolio替换为projects

/* Register Portfolio Post Type */
add_action('init', 'create_portfolio');

function create_portfolio() {

    $labels = array(
        'name' => __('Portfolio', 'post type general name'),
        'singular_name' => __('Project', 'post type singular name'),
        'add_new' => __('Add New', 'portfolio item'),
        'add_new_item' => __('Add New Project'),
        'edit_item' => __('Edit Project'),
        'new_item' => __('New Project'),
        'view_item' => __('View Project'),
        'search_items' => __('Search Projects'),
        'not_found' =>  __('Nothing found'),
        'not_found_in_trash' => __('Nothing found in Trash'),
        'parent_item_colon' => ''
    );

    $args = array(
        'labels' => $labels,
        'public' => true,
        'publicly_queryable' => true,
        'show_ui' => true,
        'query_var' => true,
        'rewrite' => true,
        'capability_type' => 'post',
        'hierarchical' => false,
        'menu_position' => null,
        'supports' => array('title','editor','thumbnail')
      ); 

    register_post_type( 'portfolio' , $args );
}

/* Register Skills Taxonomy */
register_taxonomy("Skills", array("portfolio"), array("hierarchical" => true, "label" => "Skills", "singular_label" => "Skill", "rewrite" => true));

/* Add Fields */
add_action("admin_init", "add_portfolio_fields");

function add_portfolio_fields(){
    add_meta_box("website_url", "Website URL", "website_url", "portfolio", "side", "low");
    add_meta_box("view_more", "View More", "view_more", "portfolio", "side", "low");
    add_meta_box("screenshot_name", "Screenshot Name", "screenshot_name", "portfolio", "side", "low");
    add_meta_box("thumbnail_name", "Thumbnail Name", "thumbnail_name", "portfolio", "side", "low");
    add_meta_box("thumbnail_alt", "Thumbnail Alt", "thumbnail_alt", "portfolio", "side", "low");
}

function website_url(){
    global $post;
    $custom = get_post_custom($post->ID);
    $website_url = $custom["website_url"][0];
    ?>
    <label>Website URL:</label>
    <input size="50" name="website_url" value="<?php echo $website_url; ?>" />
    <?php
}

function view_more() {
    global $post;
    $custom = get_post_custom($post->ID);
    $view_more = $custom["view_more"][0];
    ?>
    <label>View More:</label>
    <input size="50" name="view_more" value="<?php echo $view_more; ?>" />
    <?php
}

function screenshot_name() {
    global $post;
    $custom = get_post_custom($post->ID);
    $screenshot_name = $custom["screenshot_name"][0];
    ?>
    <label>Screenshot Name:</label>
    <input name="screenshot_name" value="<?php echo $screenshot_name; ?>" />
    <?php
}

function thumbnail_name() {
    global $post;
    $custom = get_post_custom($post->ID);
    $thumbnail_name = $custom["thumbnail_name"][0];
    ?>
    <label>Thumbnail Name:</label>
    <input name="thumbnail_name" value="<?php echo $thumbnail_name; ?>" />
    <?php
}

function thumbnail_alt() {
    global $post;
    $custom = get_post_custom($post->ID);
    $thumbnail_alt = $custom["thumbnail_alt"][0];
    ?>
    <label>Thumbnail Alt:</label>
    <input name="thumbnail_alt" value="<?php echo $thumbnail_alt; ?>" />
    <?php
}

add_action('save_post', 'save_portfolio_details');

function save_portfolio_details(){
    global $post;

    update_post_meta($post->ID, "website_url", $_POST["website_url"]);
    update_post_meta($post->ID, "view_more", $_POST["view_more"]);
    update_post_meta($post->ID, "screenshot_name", $_POST["screenshot_name"]);
    update_post_meta($post->ID, "thumbnail_name", $_POST["thumbnail_name"]);
    update_post_meta($post->ID, "thumbnail_alt", $_POST["thumbnail_alt"]);
}

/* Custom Columns */
add_action("manage_posts_custom_column",  "portfolio_custom_columns");
add_filter("manage_edit-portfolio_columns", "portfolio_edit_columns");

function portfolio_edit_columns($columns){
    $columns = array(
        "cb" => "<input type=\"checkbox\" />",
        "title" => "Project Title",
        "description" => "Description",
    );

    return $columns;
}

function portfolio_custom_columns($column){
    global $post;

    switch ($column) {
        case "description":
        the_excerpt();
        break;
    }
}


评论

只更换标签怎么样?

只是标签?我不确定您的意思是什么,但我希望在整个过程中进行彻底更改。

#1 楼

如果您的投资组合中还没有职位。

那真的很简单。用“ Portfolio”将所有内容重命名为“ Projects”。
您将不会丢失任何内容并更改名称。

编辑:

请尝试使用此插件http://wordpress.org/extend/plugins/ptypeconverter/来安全地导出当前帖子,并将其导入您的新自定义帖子类型。

步骤如下:

1下载并使用插件:http://wordpress.org / extend / plugins / ptypeconverter /

2将自定义帖子类型“投资组合”文件复制到保存的位置。称它为例如Portfolio_post_typeBACKUP.php

3现在,您可以确定该方法何时失败。您可以将其恢复。

4将“投资组合”更改为“项目”

5使用插件和中提琴导入帖子!

希望如此作品。

评论


啊,抱歉应该提到。投资组合中已经有很多职位。

– Desi
13年4月24日在7:37

我编辑了答案。祝好运!

–张卫
13年4月24日在7:46

这是一个很棒的插件!

– realph
2014年1月7日17:47

这个外挂程式无法正常运作。我试过了,它并没有改变所有的“旧”帖子类型。但是mysql解决方案(由Will回答)工作正常。

–honk31
17年5月5日在9:09

插件两年未更新。

–rhand
17年1月17日在8:29

#2 楼

您也可以直接使用MySQL执行此操作。

UPDATE `wp_posts`
SET 
    # Update the post_type column
    `post_type` = REPLACE(`post_type`,'name_of_old_post_type','name_of_new_post_type'),
    # Update the urls
    `guid` = REPLACE(`guid`,'name_of_old_post_type','name_of_new_post_type')
WHERE `post_type` = 'name_of_old_post_type'


注意两点:


您需要在代码中更新对此帖子类型的所有引用(例如模板,CMB2定义或分类法定义。)
如果您已在wp_postmeta的序列化数组中存储了对该帖子类型的任何引用,则您不想执行简单的UPDATE / REPLACE,因为它会炸毁它们!好吧,除非新旧帖子类型的字符串长度完全相同。


#3 楼

进一步扩展Will的答案...,尤其是如果您是通过插件执行的:

global $wpdb;
$old_post_types = array('old_type' => 'new_type');
foreach ($old_post_types as $old_type=>$type) {
    $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->posts} SET post_type = REPLACE(post_type, %s, %s) 
                         WHERE post_type LIKE %s", $old_type, $type, $old_type ) );
    $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->posts} SET guid = REPLACE(guid, %s, %s) 
                         WHERE guid LIKE %s", "post_type={$old_type}", "post_type={$type}", "%post_type={$old_type}%" ) );
    $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->posts} SET guid = REPLACE(guid, %s, %s) 
                         WHERE guid LIKE %s", "/{$old_type}/", "/{$type}/", "%/{$old_type}/%" ) );
}


此处的更改是不替换GUID中的旧类型直接,但仅当存在“ post_type = old_type”或“ / old_type /”时才替换。这样可以避免错误地替换有效段塞。 (例如,您的自定义帖子类型是投资组合,并且页面的子词中也包含投资组合)

另一种替代方法是执行以下操作:

global $wpdb, $wp_rewrite;
foreach ($old_post_types as $old_type=>$type) {
    $q = 'numberposts=-1&post_status=any&post_type='.$old_type;
    $items = get_posts($q);
    foreach ($items as $item) {
        $update['ID'] = $item->ID;
        $update['post_type'] = $type;
        wp_update_post( $update );
    }
}
$wp_rewrite->flush_rules();


评论


谢谢。这有效。一件小事:循环中第二个查询的最后一部分应该是“%post_type = {$ old_type}%”,而不是“%post_type = {$ type}%”。

–贝蒂
19/12/21在3:15

#4 楼

使用WordPress数据库查询,但不要忘记序列化的选项数据

对我有用的方法是在WordPress数据库中进行搜索和替换,但要确保不要弄乱序列化的选项数据正在进行中。我发现的最好方法是使用安全搜索并从interconnect / it中替换数据库实用程序。在不知道自己在做什么的情况下,切勿仅执行SET post_type = REPLACE( post_type ,'old_post_type','new_post_type')类型查询,否则序列化数据会中断,因为它会保留校验和并且无法正确反序列化。

在盲目关注此问题之前,请阅读“潜在问题”部分。

步骤1-用新名称安全地更新数据库


备份数据库因为以下更改很有可能破坏它。
从interconnect / it下载并解压缩安全的搜索和替换数据库实用程序

将提取的目录添加到您的webroot(它也可以工作在子目录中)
浏览目录,例如:/mywebsite.com/path/to/utility/directory/
遵循说明。如果您是模仿者,请单击“空运行”以查看更改(如果您甚至有几篇更改后的帖子类型,则有数百个)。
单击“实时运行”以完成更改。
将安全搜索目录从wordpress目录中删除,因为它存在安全问题

步骤2-重置永久链接

如果您使用永久链接,则对数据库的更新会搞砸您的重定向到自定义帖子类型。不过有一个简单的解决方法,只需进入WordPress设置/永久链接并记下当前设置(我的是“帖子名称”)。然后切换回默认设置,单击“保存”,然后返回到之前的设置,然后再次保存。您刚刚解决了重定向问题。

步骤3-重命名主题的自定义帖子类型模板

如果您像我一样,并且创建了自定义帖子类型模板,则需要重命名这些模板,否则您的自定义帖子看起来会很混乱。只需进入您的主题,找到在文件名中具有旧帖子类型名称的任何文件,然后使用新的帖子名称重命名该文件。例如,当我将帖子类型从single-project-portfolio.php更改为single-before-after.php时,我不得不将project-portfolio更改为before-after

步骤5-更新任何代码

进行文件搜索并替换为您在主题和插件文件夹中使用的旧的自定义帖子类型名称。对我来说,我有几个自定义简码,这些简码取决于我是否使用自己的自定义帖子类型之一。

测试所有内容

潜在问题(开始之前请阅读)此过程)

企业联合组织问题

如果您的自定义帖子类型是企业联合组织,请意识到您的初始搜索和替换也将更改您的帖子指南,这将迫使所有订阅者以将旧帖子视为新帖子。我不必处理此问题,但是如果需要,可以考虑手动选择safesearch实用程序处理的表,然后使用以下查询手动更新所有未序列化的数据:

SET `post_type` = REPLACE(`post_type`,'old_post_type','new_post_type')
WHERE `post_type` LIKE '%old_post_type%';


评论


列出所有这些非常整齐。除了最后的sql查询不完整之外,因为您忘记了guid,但是它们在Wills答案中列出。再加上我不会使用WHERE'post_type'像'%old_post_type%',我会使用WHERE'post_type'='old_post_type',因为您的方式也会导致其他一些post-type发生变化。

–honk31
17年1月5日,9:27



#5 楼

这是一种非常简单的方法:


运行Wordpress导出器(“工具”>“导出”)-仅导出要更改名称的帖子类型。
打开生成的.xml文件并用新名称(在“ custom_post_type”元数据和永久链接字段中)替换所有提及的旧帖子类型名称。
使用与已编辑的.xml相同的名称创建新的帖子类型(但仍然保留旧版本以防失败)
通过Wordpress Importer导入已编辑的.xml文件(可直接从“工具”>“导入”中使用插件)
检查内容是否以新帖子类型显示,然后删除旧的


评论


很聪明的主意。推荐给不想接触数据库的人

– kanlukasz
20-04-23在16:32

#6 楼

我没有发表评论的名声,所以我将其放在此处。扩展威尔的例子。我将LIKE更改为“ =”,并让它们都指向WHERE post_type

UPDATE `wp_posts`
    SET `guid` = REPLACE(`guid`,'old_post_type','new_post_type')
    WHERE `post_type` = 'old_post_type'    

UPDATE `wp_posts`
    SET `post_type` = REPLACE(`post_type`,'old_post_type','new_post_type')
    WHERE `post_type` = 'old_post_type'


还记得进入Admin> Settings> Permalinks并点击“ Save Changes” 。否则,您的链接可能会断开。

,您还需要编辑任何“单帖子类型”模板名称。

,这应该是您需要做的。