맞춤 게시물 유형의 이름을 안전하게 변경하려면 어떻게합니까?


19

'portfolio'라는 사용자 정의 게시물 유형을 만들었지 만 '프로젝트'로 변경하고 싶습니다. 이름을 안전하게 변경하고 대시 보드에서 사용자 정의 게시물 유형 게시물이 사라지지 않도록하려면 어떻게해야합니까?

참고 :에 게시물 이미 있습니다 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;
    }
}

라벨 만 교체하는 것은 어떻습니까?
Bainternet

라벨 만? 정확히 무엇을 의미하는지 잘 모르겠지만 전체적으로 철저히 변경하는 것을 선호합니다.
Desi

답변:


2

아직 포트폴리오에 게시물이없는 경우

정말 간단합니다. "포트폴리오"를 사용하여 모든 것을 "프로젝트"로 이름을 바꿉니다. 당신은 아무것도 잃지 않고 이름을 바꿀 것입니다.

편집하다 :

이 플러그인 http://wordpress.org/extend/plugins/ptypeconverter/ 를 사용하여 현재 게시물을 안전하게 내보내고 새 사용자 정의 게시물 유형으로 가져 오십시오.

단계는 다음과 같습니다.

1 플러그인 다운로드 및 사용 : http://wordpress.org/extend/plugins/ptypeconverter/

2 저장 위치에 사용자 정의 게시물 유형 "portfolio"파일을 복사하십시오. 예를 들어 portfolio_post_typeBACKUP.php

3 이제이 방법이 실패한 것이 확실합니다. 당신은 그것을 복구 할 수 있습니다.

4 " 포트폴리오 "를 " 프로젝트 " 로 변경

5 플러그인과 비올라로 게시물을 가져옵니다!

이것이 효과가 있기를 바랍니다.


아 죄송합니다. portfolio이미 많은 게시물 이 있습니다.
데시

나는 대답을 편집했다. 행운을 빕니다!
웨슬리 청

이것은 환상적인 플러그인입니다!
realph

1
이 플러그인은 더 이상 제대로 작동하지 않습니다. 나는 그것을 시도하고 모든 '오래된'게시물 유형을 변경하지 않았습니다. 그러나 mysql 솔루션 (Will의 답변)은 정상적으로 작동합니다.
honk31

플러그인은 2 년 동안 업데이트되지 않았습니다.
rhand

18

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'

두 가지주의 사항 :

  1. 코드에서이 게시물 유형에 대한 참조 (예 : 템플릿, CMB2 정의 또는 분류법 정의)를 업데이트해야합니다.
  2. 이 게시물 유형에 대한 참조를 wp_postmeta직렬화 된 배열 내에이 간단한 UPDATE / REPLACE를 원하지 않습니다. 글쎄, 새로운 글 타입과 오래된 글 타입의 길이가 정확히 같은 길이가 아니라면.

7

윌의 확장은 조금 더 대답합니다 ... 특히 플러그인에서 수행하는 경우 :

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}/%" ) );
}

여기서 변경 사항은 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();

HTH!


감사. 작동합니다. 한 가지 사소한 것 : 루프에서 두 번째 쿼리의 마지막 부분은 "% post_type = {$ type} %"이 아니라 "% post_type = {$ old_type} %"이어야합니다.
베티

3

워드 프레스 데이터베이스 쿼리를 사용하지만 직렬화 된 옵션 데이터는 잊어 버리지 않습니다.

나를 위해 일한 방법은 WordPress 데이터베이스 내에서 검색하고 바꾸는 것이었지만 프로세스에서 직렬화 된 옵션 데이터를 망칠 수는 없었습니다. 내가 찾은 가장 좋은 방법 은 상호 검색 / it에서 안전한 검색 및 데이터베이스 유틸리티 교체 를 사용하는 입니다. 체크섬을 유지하고 직렬화를 제대로 해제 할 수 없기 때문에 수행중인 작업 또는 직렬화 된 데이터가 손상 될 것이라는 것을 모르면 SETpost_type = REPLACE(post_type ,'old_post_type','new_post_type')유형 쿼리를 수행하지 마십시오 .

맹목적으로 이것을 따르기 전에 잠재적 문제 섹션을 읽으십시오

1 단계-새 이름으로 데이터베이스를 안전하게 업데이트

  1. 다음 변경 사항으로 인해 데이터베이스가 손상 될 수 있으므로 데이터베이스를 백업하십시오.
  2. 다운로드하고 압축을 풉니 다 안전한 검색을 상호 연결 / it에서 데이터베이스 유틸리티를 교체하십시오.
  3. 추출 된 디렉토리를 webroot에 추가하십시오 (하위 디렉토리에서도 작동 함)
  4. 디렉토리를 찾아보십시오 (예 : /mywebsite.com/path/to/utility/directory/).
  5. 지시에 따르세요. 파로 노이드 인 경우 '건조 실행'을 클릭하여 변경 사항을 확인합니다 (변경된 게시물 유형의 게시물이 몇 개인 경우 수백 개가 있음)
  6. '실시간 실행'을 클릭하여 변경을 완료하십시오.
  7. 보안 문제 때문에 wordpress 디렉토리에서 안전한 검색 디렉토리를 제거하십시오.

2 단계-퍼머 링크 재설정

퍼머 링크를 사용하는 경우 데이터베이스를 업데이트하면 사용자 지정 게시물 유형으로 리디렉션이 중단됩니다. 쉬운 수정이 있지만 WordPress 설정 / 퍼머 링크로 이동하여 현재 설정 (내 이름은 '게시 이름')을 기록하십시오. 그런 다음 기본값으로 다시 전환하고 '저장'을 클릭 한 다음 이전 설정으로 돌아가서 다시 저장하십시오. 리디렉션 문제를 해결했습니다.

3 단계-테마의 맞춤 게시물 유형 템플릿 이름 바꾸기

나와 같은데 맞춤 게시물 유형 템플릿을 만든 경우 이름을 변경해야합니다. 그렇지 않으면 맞춤 게시물이 잘못 표시됩니다. 테마로 이동하여 파일 이름에 이전 게시물 유형 이름이있는 파일을 찾은 다음 새 게시물 이름을 사용하여 파일 이름을 바꾸십시오. 예를 들어 게시물 유형을에서 (으) 로 변경할 때로 변경 single-project-portfolio.php해야 했습니다 .single-before-after.phpproject-portfoliobefore-after

5 단계-모든 코드 업데이트

테마 및 플러그인 폴더에서 파일 검색을 수행하고 이전 사용자 정의 게시물 유형 이름을 바꾸십시오. 나에게는 맞춤 게시물 유형 중 하나를 사용하고 있는지 여부를 결정하는 데 사용되는 여러 개의 맞춤 단축 코드가 있습니다.

모든 것을 시험하십시오

잠재적 인 문제 (이 절차를 시작하기 전에 읽으십시오)

신디케이션 문제

사용자 정의 게시물 유형이 신디케이트 된 경우 초기 검색 및 교체시 게시물의 안내도 변경되므로 모든 구독자가 이전 게시물을 새 것으로 표시해야합니다. 이 문제를 해결할 필요는 없지만 필요한 경우 safesearch 유틸리티가 처리하는 테이블을 수동으로 선택한 다음 다음 쿼리를 사용하여 직렬화되지 않은 데이터를 수동으로 업데이트하십시오.

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

이 모든 것을 나열하기 위해 매우 깔끔합니다. guid를 잊어 버렸기 때문에 끝에있는 SQL 쿼리가 완료되지 않았지만 Wills 답변에 나열되어 있습니다. 또한 나는 함께 가지 않을 것이다 WHERE 'post_type' LIKE '%old_post_type%'. 나는 WHERE 'post_type' = 'old_post_type'당신의 방법이 다른 포스트 타입을 변화시킬 수 있기 때문에 사용할 것이다 .
honk31

0

나는 언급 할 평판이 없으므로 여기에 넣을 것입니다. 의지를 확장하는 것. LIKE를 "="로 변경하고 둘 다 어디로 향하게했는지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'

또한 관리자> 설정> 영구 링크로 이동하여 "변경 사항 저장"을 누르십시오. 그렇지 않으면 링크가 손상 될 수 있습니다.

또한 '단일 포스트 유형'템플릿 이름을 편집해야합니다.

이것은 당신이해야 할 모든 것입니다.


0

다음은 정말 간단한 방법입니다.

  1. Wordpress Exporter (도구> 내보내기)를 실행하십시오. 이름을 변경하려는 게시물 유형 만 내보내십시오.
  2. 생성 된 .xml 파일을 열고 이전 게시물 유형 이름의 모든 언급을 새 이름으로 바꿉니다 ( "custom_post_type"메타 및 영구 링크 필드)
  3. 편집 된 .xml에서와 동일한 이름으로 새 게시물 유형을 작성하십시오 (그러나 실패 할 경우 여전히 이전 게시물 유형을 유지하십시오)
  4. Wordpress Importer (도구> 가져 오기에서 직접 사용 가능한 플러그인)를 통해 편집 된 .xml 파일을 가져옵니다.
  5. 컨텐츠가 새 게시물 유형으로 존재하는지 확인한 후 이전 게시물 유형을 제거하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.