Come posso cambiare in sicurezza il nome di un tipo di post personalizzato?


19

Ho creato un tipo di post personalizzato chiamato "portfolio" ma voglio cambiarlo in "progetti". Quali sarebbero i passi esatti che devo prendere per cambiare in modo sicuro il nome e impedire che i post del tipo di post personalizzati scompaiano nella dashboard?

Nota: ci sono già messaggi in portfoliomodo che non posso semplicemente uscire portfoliocon 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;
    }
}

che ne dici di sostituire solo le etichette?
Bainternet,

Solo le etichette? Non sono sicuro di cosa significhi, ma preferirei cambiarlo completamente.
Desi

Risposte:


2

Se non hai ancora post nel tuo portfolio.

Sarebbe davvero semplice. Rinomina tutto con "Portfolio" in "Progetti". Non perderai nulla e cambierai il nome.

Modificare :

Prova a utilizzare questo plugin http://wordpress.org/extend/plugins/ptypeconverter/ per esportare i post correnti in modo sicuro e importarli nel nuovo tipo di post personalizzato.

Quindi i passaggi sono:

1 Scarica e usa il plug-in: http://wordpress.org/extend/plugins/ptypeconverter/

2 Copia il tuo tipo di post personalizzato "portfolio" file da qualche parte salva. chiamalo ad esempio portfolio_post_typeBACKUP.php

3 Ora sei sicuro quando questo metodo fallisce. puoi recuperarlo.

4 Cambia " portafoglio " in " progetti "

5 Importa i post con il plugin e viola!

Spero che funzioni.


Ah, scusa, avrei dovuto dirlo. Ci sono già molti post in portfolio.
Desi

ho modificato la risposta. in bocca al lupo!
Wesley Cheung,

Questo è un plugin fantastico!
realph

1
questo plugin non funziona più correttamente. l'ho provato e non ha cambiato tutti i tipi di post "vecchi". ma la soluzione mysql (risposta di Will) funziona bene.
honk31,

Il plug-in non è stato aggiornato da due anni.
1717

18

Puoi farlo direttamente anche con 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'

Due cose da notare:

  1. Dovrai aggiornare qualsiasi riferimento a questo tipo di post nel tuo codice (ad esempio, modelli, definizioni CMB2 o definizioni di tassonomia).
  2. Se hai memorizzato riferimenti a questo tipo di post all'interno wp_postmetadi array serializzati, non vuoi fare un semplice AGGIORNAMENTO / SOSTITUZIONE perché li farà saltare in aria! Bene, a meno che le stringhe di tipo post sia nuove che vecchie non abbiano la stessa identica lunghezza.

7

Estendere la risposta di Will un po 'di più ..., e specialmente se lo stai facendo dal tuo 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}/%" ) );
}

La modifica qui è di non sostituire direttamente il vecchio tipo nel guid, ma sostituirlo solo se è presente "post_type = old_type" o "/ old_type /". Ciò evita di sostituire per errore le lumache valide. (ad esempio, il tipo di post personalizzato è portfolio e anche la lumaca di una pagina contiene portfolio)

Un'altra alternativa è fare qualcosa del genere:

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!


Grazie. Questo funziona Una cosa minore: l'ultima parte della seconda query nel ciclo dovrebbe essere "% post_type = {$ old_type}%", non "% post_type = {$ type}%".
Betty,

3

Usa una query sul database WordPress ma non dimenticare i dati delle opzioni serializzate

Il metodo che ha funzionato per me è stato quello di fare una ricerca e sostituire all'interno del database WordPress, ma assicurandomi di non rovinare i dati delle opzioni serializzati nel processo. Il modo migliore che ho trovato è utilizzare la ricerca sicura e sostituire l'utilità del database da interconnessione . Non eseguire mai una query di tipo SETpost_type = REPLACE(post_type ,'old_post_type','new_post_type')senza sapere cosa si sta facendo o i dati serializzati si interromperanno poiché mantiene un checksum e non sarà in grado di annullare la serializzazione corretta.

Leggi la sezione Problemi potenziali prima di seguire ciecamente questo

Passaggio 1: aggiorna in modo sicuro il tuo database con un nuovo nome

  1. eseguire il backup del database perché le seguenti modifiche hanno un potenziale reale di corromperlo.
  2. scaricare e decomprimere la ricerca sicura e sostituire l'utilità del database da interconnect / it
  3. aggiungi la directory estratta al tuo webroot (funziona anche nelle sottodirectory)
  4. passare alla directory, ad esempio: /mywebsite.com/path/to/utility/directory/
  5. seguire le indicazioni. fai clic su "dry-run" se sei paronoico per vedere le modifiche (ce ne saranno centinaia se hai anche qualche post del tipo di post modificato)
  6. fai clic su "live run" per finalizzare le modifiche.
  7. rimuovere la directory di ricerca sicura dalla directory di wordpress poiché è un problema di sicurezza

Passaggio 2: reimposta i permalink

Se si utilizzano permalink, gli aggiornamenti del database rovinano i reindirizzamenti ai tipi di post personalizzati. C'è una soluzione semplice, basta andare nelle impostazioni / permalink di WordPress e annotare l'impostazione corrente (la mia era "nome post"). Quindi tornare ai valori predefiniti, fare clic su "Salva", quindi tornare all'impostazione precedente, quindi salvare di nuovo. Hai appena risolto i problemi di reindirizzamento.

Passaggio 3: rinominare i modelli di tipo di posta personalizzati del tema

Se sei come me e hai creato modelli di tipo di post personalizzati, dovrai rinominarli o i tuoi post personalizzati sembreranno rovinati. Basta andare nel tema e trovare qualsiasi file che ha il vecchio nome del tipo di post nel nome del file e rinominare il file utilizzando il nuovo nome del post. Ad esempio, ho dovuto passare single-project-portfolio.phpa single-before-after.phpquando ho cambiato il mio tipo di post da project-portfolioabefore-after .

Passaggio 5: aggiorna qualsiasi codice

Esegui una ricerca di file e sostituisci il tuo vecchio nome di post personalizzato nella cartella del tema e dei plug-in. Per me, avevo diversi codici brevi personalizzati che si basavano sul prendere una decisione se stavo usando uno dei miei tipi di post personalizzati.

Prova tutto

Potenziali problemi (leggi prima di iniziare questa procedura)

Problemi di sindacazione

Se i tuoi tipi di post personalizzati sono stati sindacati, renditi conto che la tua ricerca iniziale e la sostituzione cambieranno anche le guide dei tuoi post, il che costringerà tutti gli abbonati a vedere i vecchi post come nuovi. Non ho avuto a che fare con questo, ma se è necessario, quindi considerare la scelta manuale delle tabelle elaborate dall'utilità safesearch, quindi aggiornare manualmente tutti i dati non serializzati utilizzando la seguente query:

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

molto pulito per elencare tutto questo. tranne che la query sql alla fine non è completa, poiché hai dimenticato il guid, ma sono elencati nella risposta di Wills. in più non ci andrei WHERE 'post_type' LIKE '%old_post_type%', lo WHERE 'post_type' = 'old_post_type'
userei

0

Non ho la reputazione di commentare, quindi lo inserirò qui. Estendere l'esempio di Will. Ho cambiato i LIKE in "=" e li ho entrambi puntati su DOVEpost_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'

Ricorda anche di accedere ad Ammin.> Impostazioni> Permalink e premere "Salva modifiche". Altrimenti i tuoi collegamenti saranno probabilmente interrotti.

Sarà inoltre necessario modificare i nomi dei modelli "a post singolo".

Questo dovrebbe essere tutto ciò che devi fare.


0

Ecco un modo davvero semplice:

  1. Esegui Wordpress Exporter (Strumenti> Esporta): esporta solo il tipo di post di cui vuoi cambiare il nome
  2. Apri il file .xml generato e sostituisci tutte le menzioni del vecchio nome del tipo di post con il nuovo nome (nel meta "custom_post_type" e nel campo permalink)
  3. Crea il tuo nuovo tipo di post con lo stesso nome del file .xml modificato (ma conserva comunque quello vecchio in caso di errore)
  4. Importa il file .xml modificato tramite Wordpress Importer (plug-in disponibile direttamente da Strumenti> Importa)
  5. Verifica che il contenuto sia presente nel nuovo tipo di post, quindi rimuovi quello precedente
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.