Como posso alterar com segurança o nome de um tipo de postagem personalizado?

15

Eu fiz um tipo de postagem personalizado chamado 'portfólio', mas quero alterá-lo para 'projetos'. Quais seriam as etapas exatas que eu preciso executar para alterar o nome com segurança e evitar que as postagens de tipo de postagem personalizada desapareçam do painel?

Observação: já há postagens em portfolio , por isso não posso simplesmente trocar portfolio por 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;
    }
}
    
por Desi 24.04.2013 / 09:20

6 respostas

2

Se você ainda não tem postagens em seu portfólio.

Seria muito simples. Renomeie tudo com "Portfólio" para "Projetos". Você não perderá nada e mudará o nome.

Editar:

Tente usar este plugin enlace para exportar as postagens atuais com segurança e importá-las para o novo tipo de postagem personalizada.

Então os passos são:

1 Faça o download e use o plug-in: enlace

2 Copie o arquivo "portfolio" do seu tipo de postagem personalizado para algum lugar salvo. chame por exemplo portfolio_post_typeBACKUP.php

3 Agora você tem certeza quando esse método falha. você pode recuperá-lo.

4 Altere " portfolio " para " projetos "

5 Importe as postagens com o plug-in e a viola!

Espero que isso funcione.

    
por Wesley Cheung 24.04.2013 / 09:34
16

Você pode fazer isso diretamente com o MySQL também.

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'

Duas coisas a serem observadas:

  1. Você precisará atualizar qualquer referência a esse tipo de postagem em seu código (por exemplo, modelos, definições do CMB2 ou definições de taxonomia).
  2. Se você armazenou alguma referência a esse tipo de postagem em wp_postmeta dentro de matrizes serializadas, não quer fazer uma simples UPDATE / REPLACE porque isso vai explodi-las! Bem, a menos que as novas e antigas strings do tipo post tenham exatamente o mesmo tamanho.
por Will 13.01.2014 / 05:42
6

Estendendo a resposta de Will um pouco mais longe ... e especialmente se você estiver fazendo isso com seu plug-in:

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

A alteração aqui é para não substituir o tipo antigo no guid diretamente, mas substituir somente se "post_type = old_type" ou "/ old_type /" estiver presente. Isso evita a substituição de slugs válidos por engano. (por exemplo, seu tipo de postagem personalizada é um portfólio, e o slug de uma página também tem um portfólio)

Outra alternativa é fazer algo assim:

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!

    
por Nirav Mehta 17.07.2014 / 08:11
2

Use uma consulta de banco de dados do WordPress, mas não se esqueça dos dados de opções serializadas

O método que funcionou para mim foi fazer uma pesquisa e substituição dentro do banco de dados do WordPress, mas certificando-se de não estragar dados de opções serializadas no processo. A melhor maneira que encontrei é usar a pesquisa segura e substituir o utilitário de banco de dados da interconexão / it . Nunca faça uma consulta SET post_type = REPLACE( post_type ,'old_post_type','new_post_type') type sem saber o que você está fazendo ou os dados serializados serão interrompidos, pois eles mantêm uma soma de verificação e não serão capazes de desserializar corretamente.

Leia a seção Potential Issues antes de seguir cegamente isso

Etapa 1 - Atualize com segurança seu banco de dados com novo nome

  1. faça backup do banco de dados porque as alterações a seguir têm um potencial muito real de corrompê-lo.
  2. faça o download e descompacte a pesquisa segura e substitua o utilitário de banco de dados da interconexão / it
  3. adicione o diretório extraído ao seu webroot (ele também funciona em subdiretórios)
  4. navegue até o diretório, por exemplo: /mywebsite.com/path/to/utility/directory /
  5. siga as instruções. clique em "dry-run" se você estiver paronóico para ver as alterações (haverá centenas se você tiver algumas postagens do tipo de postagem alterado)
  6. clique em "execução ao vivo" para finalizar as alterações.
  7. remova o diretório de pesquisa seguro do diretório do wordpress, já que é um problema de segurança

Etapa 2 - Redefinir seus permalinks

Se você estiver usando permalinks, as atualizações no seu banco de dados estragarão seus redirecionamentos para seus tipos de postagem personalizados. Há uma solução fácil, basta acessar as configurações do WordPress / permalinks e anotar a configuração atual (o meu era 'post name'). Em seguida, volte para o padrão, clique em "salvar", volte para a configuração anterior e salve novamente. Você acabou de corrigir seus problemas de redirecionamento.

Etapa 3 - Renomear os modelos de tipo de postagem personalizada do seu tema

Se você é como eu e criou modelos de tipo de postagem personalizados, será necessário renomeá-los ou suas postagens personalizadas ficarão confusas. Basta entrar no seu tema e encontrar qualquer arquivo que tenha o nome do seu post antigo em seu nome de arquivo e renomeie o arquivo usando o novo nome do seu post. Por exemplo, eu tive que alterar single-project-portfolio.php para single-before-after.php quando mudei meu tipo de postagem de project-portfolio para before-after .

Etapa 5 - Atualizar qualquer código

Faça uma pesquisa de arquivos e substitua o nome do seu antigo nome de postagem personalizado na pasta de temas e plug-ins. Para mim, eu tinha vários códigos de acesso personalizados que dependiam da decisão sobre se eu estava usando um dos meus tipos de postagem personalizados.

Testar tudo

Problemas potenciais (leia antes de iniciar este procedimento)

Problemas de distribuição

Se os tipos de postagem personalizados foram distribuídos, perceba que sua pesquisa e substituição iniciais também alterarão os guias de suas postagens, o que forçará todos os inscritos a ver as postagens antigas como novas. Eu não tive que lidar com isso, mas se você precisar, considere escolher manualmente as tabelas que o utilitário safesearch processa e, em seguida, atualizar manualmente quaisquer dados não serializados usando a seguinte consulta:

SET 'post_type' = REPLACE('post_type','old_post_type','new_post_type')
WHERE 'post_type' LIKE '%old_post_type%';
    
por AndrewD 17.04.2015 / 21:58
0

Eu não tenho a reputação de comentar, então vou colocar isso aqui. Estendendo o exemplo de Will. Mudei os LIKEs para "=" e peça que apontem para 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'

Lembre-se também de entrar no diretório Admin > Configurações > Permalinks e clique em "Salvar alterações". Caso contrário, seus links provavelmente serão quebrados.

Você também precisará editar qualquer nome de modelo 'single-post-type'.

Isso deve ser tudo que você precisa fazer.

    
por Bullyen 22.10.2014 / 16:31
0

Aqui está uma maneira muito simples:

  1. Executar o Wordpress Exporter (Ferramentas > Exportar) - exportar apenas o tipo de postagem que você deseja alterar o nome de
  2. Abra o arquivo .xml gerado e substitua todas as menções do nome antigo do tipo de postagem pelo novo nome (no meta "custom_post_type" e também no campo permalink)
  3. Crie seu novo tipo de postagem com o mesmo nome do .xml editado (mas ainda mantenha o antigo caso ele falhe)
  4. Importe o arquivo .xml editado pelo Importador do Wordpress (o plug-in disponível diretamente em Ferramentas > Importar)
  5. Verifique se o conteúdo está presente no novo tipo de postagem e, em seguida, remova o antigo
por Dagobert Renouf 09.11.2015 / 18:22