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

19

Fiz um tipo de postagem personalizado chamado 'portfólio', mas quero alterá-lo para 'projetos'. Quais seriam as etapas exatas que preciso tomar para alterar o nome com segurança e impedir que as postagens personalizadas do tipo de postagem desapareçam no painel?

Nota: Já existem lugares em portfolioque eu não pode simplesmente mudar para fora portfoliocom 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;
    }
}
Desi
fonte
que tal substituir apenas os rótulos?
precisa saber é o seguinte
Apenas os rótulos? Não sei exatamente o que você quer dizer, mas prefiro alterá-lo completamente.
Desi

Respostas:

2

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

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

Editar:

Tente usar este plugin http://wordpress.org/extend/plugins/ptypeconverter/ para exportar as postagens atuais com segurança e importá-las para seu novo tipo de postagem personalizada.

Portanto, as etapas são:

1 Faça o download e use o plugin: http://wordpress.org/extend/plugins/ptypeconverter/

2 Copie o arquivo "portfólio" do seu tipo de postagem personalizado em algum lugar, salve. chame-o, por exemplo, portfolio_post_typeBACKUP.php

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

4 Altere " portfólio " para " projetos "

5 Importe as postagens com o plugin e o viola!

Espero que isso funcione.

Wesley Cheung
fonte
Ah, desculpe deveria ter mencionado. Já existem muitas postagens portfolio.
Desi
eu editei a resposta. boa sorte!
Wesley Cheung
Este é um plugin fantástico!
Realph
11
este plugin não está mais funcionando corretamente. Eu tentei e não mudou todos os tipos de post 'antigos'. mas a solução mysql (resposta por Will) funciona bem.
precisa saber é
O plug-in não foi atualizado em dois anos.
rhand
18

Você também pode fazer isso diretamente com o 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'

Duas coisas a serem observadas:

  1. Você precisará atualizar todas as referências a este tipo de postagem no seu código (por exemplo, modelos, definições CMB2 ou definições de taxonomia).
  2. Se você armazenou alguma referência a esse tipo de postagem dentro de wp_postmetamatrizes serializadas, não deseja fazer uma simples ATUALIZAÇÃO / SUBSTITUIÇÃO, pois ela as explodirá! Bem, a menos que as seqüências de caracteres novas e antigas tenham o mesmo comprimento.
Vai
fonte
7

Estendendo a resposta de Will um pouco mais ... e especialmente se você estiver fazendo isso no seu plugin:

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 mudança aqui é não substituir diretamente o tipo antigo no guid, mas substitua apenas se "post_type = old_type" ou "/ old_type /" estiver presente. Isso evita a substituição de lesmas válidas por engano. (por exemplo, seu tipo de postagem personalizado é portfólio e a lesma de uma página também possui 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!

Nirav Mehta
fonte
Obrigado. Isso funciona. Uma coisa pequena: a última parte da segunda consulta no loop deve ser "% post_type = {$ old_type}%", não "% post_type = {$ type}%".
Betty
3

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

O método que funcionou para mim foi fazer uma pesquisa e substituir no banco de dados WordPress, mas certificando-se de não estragar os dados das 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 do tipo SETpost_type = REPLACE(post_type ,'old_post_type','new_post_type')sem saber o que você está fazendo ou os dados serializados serão interrompidos, pois mantém uma soma de verificação e não será capaz de desserializar adequadamente.

Leia a seção Problemas potenciais antes de seguir cegamente este

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

  1. faça backup do seu banco de dados porque as seguintes alterações têm um potencial muito real de corrompê-lo.
  2. faça o download e descompacte o utilitário de pesquisa segura e substitua o banco de dados do interconnect / 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 direções. clique em 'executar a seco' se você for paronoide para ver as alterações (haverá centenas se você tiver algumas postagens do tipo de postagem alterada)
  6. clique em 'execução ao vivo' para finalizar as alterações.
  7. remova o diretório de pesquisa segura do diretório wordpress, pois é um problema de segurança

Etapa 2 - Redefinir seus links permanentes

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

Etapa 3 - Renomeie os modelos de tipo de postagem personalizados do seu tema

Se você é como eu e criou modelos de tipo de postagem personalizados, precisará renomeá-los ou suas postagens personalizadas parecerão erradas. Basta entrar no seu tema e encontrar qualquer arquivo que tenha o seu antigo nome de tipo de postagem no nome do arquivo e renomeá-lo usando seu novo nome de postagem. Por exemplo, tive que mudar single-project-portfolio.phppara single-before-after.phpquando alterei meu tipo de postagem de project-portfoliopara before-after.

Etapa 5 - Atualizar qualquer código

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

Teste Tudo

Problemas potenciais (leia antes de iniciar este procedimento)

Problemas de organização

Se seus tipos de postagem personalizados foram organizados, saiba que sua pesquisa e substituição inicial também mudarão os guias de suas postagens, o que forçará todos os assinantes a ver as postagens antigas como novas. Não precisei lidar com isso, mas se você precisar, considere escolher manualmente as tabelas que o utilitário safesearch processa e 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%';
AndrewD
fonte
muito arrumado para listar tudo isso. exceto que a consulta sql no final não está concluída, pois você esqueceu o guia, mas eles estão listados na resposta Wills. mais eu não iria com WHERE 'post_type' LIKE '%old_post_type%', gostaria de usar WHERE 'post_type' = 'old_post_type', uma vez que seu caminho poderia também causar alguns outros pós-tipos, para mudar ..
honk31
0

Não tenho reputação de comentar, então colocarei isso aqui. Estendendo o exemplo de Will. Alterei os LIKEs para "=" e os dois apontam para 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'

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

Você também precisará editar qualquer nome de modelo 'tipo único de postagem'.

Isso deve ser tudo o que você precisa fazer.

Bullyen
fonte
0

Aqui está uma maneira realmente simples:

  1. Execute o Exportador do Wordpress (Ferramentas> Exportar) - exporte apenas o tipo de postagem que você deseja alterar o nome
  2. Abra o arquivo .xml gerado e substitua todas as menções do antigo nome do tipo de postagem pelo novo nome (na meta "custom_post_type" e no campo permalink)
  3. Crie seu novo tipo de postagem com o mesmo nome que o .xml editado (mas mantenha o antigo caso falhe)
  4. Importe o arquivo .xml editado pelo Importador do Wordpress (plug-in disponível diretamente em Ferramentas> Importar)
  5. Verifique se o conteúdo está presente no novo tipo de postagem e remova o antigo
Dagobert Renouf
fonte