Làm cách nào để thay đổi tên của loại bài đăng tùy chỉnh một cách an toàn?


19

Tôi đã tạo một loại bài đăng tùy chỉnh được gọi là 'danh mục đầu tư' nhưng tôi muốn thay đổi nó thành 'dự án'. Điều gì sẽ là các bước chính xác tôi cần thực hiện để thay đổi tên một cách an toàn và ngăn bài đăng loại bài đăng tùy chỉnh biến mất trong bảng điều khiển?

Lưu ý: Đã có bài viết nào trong portfoliovì vậy tôi không thể chỉ chuyển đổi ra portfoliovới 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;
    }
}

Làm thế nào về việc chỉ thay thế các nhãn?
Bai Internet

Chỉ là nhãn? Tôi không chắc chính xác ý bạn là gì nhưng tôi muốn thay đổi nó một cách triệt để.
Desi

Câu trả lời:


2

Nếu bạn chưa có bài viết trong danh mục đầu tư của bạn.

Nó sẽ thực sự đơn giản. Đổi tên mọi thứ với "Danh mục đầu tư" thành "Dự án". Bạn sẽ không mất gì và thay đổi tên.

Chỉnh sửa :

Hãy thử sử dụng plugin này http://wordpress.org/extend/plugins/ptypeconverter/ để xuất các bài đăng hiện tại một cách an toàn và nhập nó vào loại bài đăng tùy chỉnh mới của bạn.

Vì vậy, các bước là:

1 Tải xuống và sử dụng plugin: http://wordpress.org/extend/plugins/ptypeconverter/

2 Sao chép tập tin "danh mục" tùy chỉnh của bạn ở một nơi nào đó lưu. gọi nó là ví dụ portfolio_post_typeBACKUP.php

3 Bây giờ bạn chắc chắn khi phương pháp này thất bại. bạn có thể phục hồi nó

4 Thay đổi " danh mục đầu tư " thành " dự án "

5 Nhập các bài đăng với plugin và viola!

Hy vọng điều này làm việc.


Ah, xin lỗi nên đã đề cập. Có rất nhiều bài viết trong portfolio.
Desi

tôi chỉnh sửa câu trả lời. chúc may mắn!
Wesley Cheung

Đây là một plugin tuyệt vời!
realph

1
Plugin này không hoạt động đúng nữa. tôi đã thử nó và nó đã không thay đổi tất cả các loại bài 'cũ'. nhưng giải pháp mysql (câu trả lời của Will) hoạt động tốt.
honk31

Plugin đã không được cập nhật trong hai năm.
rhand

18

Bạn có thể làm điều này trực tiếp với MySQL là tốt.

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'

Hai điều cần lưu ý:

  1. Bạn sẽ cần cập nhật bất kỳ tài liệu tham khảo nào cho loại bài đăng này trong mã của bạn (giả sử, mẫu, định nghĩa CMB2 hoặc định nghĩa phân loại).
  2. Nếu bạn đã lưu trữ bất kỳ tài liệu tham khảo nào cho loại bài đăng này wp_postmetatrong các mảng được tuần tự hóa, bạn không muốn thực hiện CẬP NHẬT / THAY THẾ đơn giản vì nó sẽ làm nổ tung chúng! Chà, trừ khi cả hai chuỗi loại bài mới và cũ có cùng độ dài.

6

Mở rộng câu trả lời của Will thêm một chút nữa ... và đặc biệt nếu bạn đang thực hiện nó từ plugin của mình:

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={$type}%" ) );
    $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->posts} SET guid = REPLACE(guid, %s, %s) 
                         WHERE guid LIKE %s", "/{$old_type}/", "/{$type}/", "%/{$old_type}/%" ) );
}

Thay đổi ở đây là không trực tiếp thay thế loại cũ trong hướng dẫn mà chỉ thay thế nếu có "post_type = old_type" hoặc "/ old_type /". Điều này tránh thay thế sên hợp lệ do nhầm lẫn. (ví dụ: loại bài đăng tùy chỉnh của bạn là danh mục đầu tư và sên của một trang cũng có danh mục đầu tư trong đó)

Một cách khác là làm một cái gì đó như thế này:

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();

HTH!


3

Sử dụng truy vấn cơ sở dữ liệu WordPress nhưng đừng quên dữ liệu tùy chọn nối tiếp

Phương pháp hiệu quả với tôi là thực hiện tìm kiếm và thay thế trong cơ sở dữ liệu WordPress, nhưng đảm bảo không làm hỏng dữ liệu tùy chọn nối tiếp trong quy trình. Cách tốt nhất tôi tìm thấy là sử dụng tiện ích tìm kiếm an toàn và thay thế cơ sở dữ liệu từ kết nối / nó . Không bao giờ chỉ làm một SETpost_type = REPLACE(post_type ,'old_post_type','new_post_type')truy vấn loại mà không biết những gì bạn đang làm hoặc dữ liệu đăng sẽ phá vỡ vì nó giữ một checksum và sẽ không thể unserialize đúng cách.

Đọc phần Các vấn đề tiềm năng trước khi mù quáng theo dõi điều này

Bước 1 - Cập nhật an toàn cơ sở dữ liệu của bạn với tên mới

  1. sao lưu cơ sở dữ liệu của bạn vì những thay đổi sau đây có tiềm năng rất lớn để làm hỏng nó.
  2. tải xuống và giải nén tìm kiếm an toàn và thay thế tiện ích cơ sở dữ liệu từ interconnect / nó
  3. thêm thư mục giải nén vào webroot của bạn (nó cũng hoạt động trong thư mục con)
  4. duyệt đến thư mục, ví dụ: /mywebsite.com/path/to/utility/directory/
  5. làm theo chỉ dẫn nhấp vào 'chạy khô' nếu bạn là paronoid để xem các thay đổi (sẽ có hàng trăm nếu bạn thậm chí có một vài bài đăng thuộc loại bài thay đổi)
  6. nhấp vào 'chạy trực tiếp' để hoàn tất các thay đổi.
  7. xóa thư mục tìm kiếm an toàn khỏi thư mục wordpress của bạn vì nó là một vấn đề bảo mật

Bước 2 - Đặt lại Permalinks của bạn

Nếu bạn đang sử dụng permalinks, các bản cập nhật cho cơ sở dữ liệu của bạn sẽ chuyển hướng chuyển hướng sang các loại bài đăng tùy chỉnh của bạn. Mặc dù vậy, có một cách khắc phục dễ dàng, chỉ cần đi vào cài đặt / permalinks của WordPress và lưu ý cài đặt hiện tại (tên của tôi là 'tên bài đăng'). Sau đó chuyển về mặc định, nhấp vào 'lưu', sau đó quay lại cài đặt trước đó, sau đó lưu lại. Bạn vừa sửa các vấn đề chuyển hướng của bạn.

Bước 3 - Đổi tên mẫu Loại bài đăng tùy chỉnh của chủ đề của bạn

Nếu bạn giống tôi và bạn đã tạo các mẫu bài đăng tùy chỉnh, bạn sẽ cần đổi tên những mẫu này hoặc các bài đăng tùy chỉnh của bạn sẽ bị rối tung lên. Chỉ cần đi vào chủ đề của bạn và tìm bất kỳ tệp nào có tên loại bài đăng cũ của bạn trong tên tệp của nó và đổi tên tệp bằng tên bài đăng mới của bạn. Ví dụ, tôi phải thay đổi single-project-portfolio.phpthành single-before-after.phpkhi tôi thay đổi loại bài đăng của mình từ project-portfoliothành before-after.

Bước 5 - Cập nhật bất kỳ mã nào

Thực hiện tìm kiếm tệp và thay thế cho tên loại bài đăng tùy chỉnh cũ của bạn trong thư mục chủ đề và plugin. Đối với tôi, tôi đã có một số mã ngắn tùy chỉnh dựa trên việc đưa ra quyết định về việc tôi có đang sử dụng một trong các loại bài đăng tùy chỉnh của mình không.

Kiểm tra mọi thứ

Các vấn đề tiềm năng (đọc trước khi bắt đầu thủ tục này)

Vấn đề tổ chức

Nếu loại bài đăng tùy chỉnh của bạn được cung cấp, hãy nhận ra rằng tìm kiếm và thay thế ban đầu của bạn cũng sẽ thay đổi hướng dẫn của bài đăng của bạn, điều này sẽ buộc tất cả người đăng ký xem bài đăng cũ là bài đăng mới. Tôi không phải đối phó với điều này, nhưng nếu bạn cần, sau đó xem xét việc chọn thủ công các bảng mà tiện ích tìm kiếm xử lý, sau đó cập nhật thủ công bất kỳ dữ liệu không tuần tự nào bằng truy vấn sau:

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

rất gọn gàng để liệt kê tất cả điều này lên. ngoại trừ truy vấn sql cuối cùng không đầy đủ, vì bạn đã quên hướng dẫn, nhưng chúng được liệt kê trong câu trả lời của Wills. cộng với tôi sẽ không đi cùng WHERE 'post_type' LIKE '%old_post_type%', tôi sẽ sử dụng WHERE 'post_type' = 'old_post_type', vì cách của bạn cũng có thể khiến một số loại bài đăng khác, thay đổi ..
honk31

0

Tôi không có tiếng tăm để bình luận nên tôi sẽ đặt nó ở đây. Mở rộng ví dụ của Will. Tôi đã thay đổi các THÍCH thành "=" và cả hai đều trỏ đến WHEREpost_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'

Ngoài ra, hãy nhớ đi vào Quản trị viên> Cài đặt> Permalinks và nhấn "Lưu thay đổi". Nếu không các liên kết của bạn sẽ có thể bị phá vỡ.

Bạn cũng sẽ cần chỉnh sửa bất kỳ tên mẫu 'kiểu đơn bài' nào.

Đây là tất cả những gì bạn cần làm.


0

Đây là một cách thực sự đơn giản:

  1. Chạy Trình xuất Wordpress (Công cụ> Xuất) - chỉ xuất loại bài đăng bạn muốn thay đổi tên của
  2. Mở tệp .xml đã tạo và thay thế tất cả các đề cập đến tên loại bài đăng cũ bằng tên mới (trong meta "custom_post_type" cũng như trong trường permalink)
  3. Tạo loại bài đăng mới của bạn có cùng tên như trong .xml đã chỉnh sửa (nhưng vẫn giữ loại bài đăng cũ trong trường hợp không thành công)
  4. Nhập tệp .xml đã chỉnh sửa thông qua Trình nhập Wordpress (plugin có sẵn trực tiếp từ Công cụ> Nhập)
  5. Kiểm tra xem nội dung có trong loại bài đăng mới và sau đó xóa nội dung cũ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.