Comment modifier en toute sécurité le nom d'un type de publication personnalisé?

19

J'ai créé un type de publication personnalisé appelé «portfolio» mais je veux le changer en «projets». Quelles seraient les étapes exactes à suivre pour changer le nom en toute sécurité et empêcher les messages de type de message personnalisé de disparaître dans le tableau de bord?

Remarque: il y a déjà des messages, portfoliodonc je ne peux pas simplement passer portfolioavec 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
la source
que diriez-vous de remplacer uniquement les étiquettes?
Bainternet
Juste les étiquettes? Je ne sais pas exactement ce que vous voulez dire, mais je préférerais le changer complètement tout au long.
Desi

Réponses:

2

Si vous n'avez encore aucun article dans votre portfolio.

Ce serait vraiment simple. Renommez tout avec "Portfolio" en "Projets". Vous ne perdrez rien et changerez le nom.

Éditer :

Essayez d'utiliser ce plugin http://wordpress.org/extend/plugins/ptypeconverter/ pour exporter les publications actuelles en toute sécurité et l'importer dans votre nouveau type de publication personnalisé.

Les étapes sont donc:

1 Téléchargez et utilisez le plugin: http://wordpress.org/extend/plugins/ptypeconverter/

2 Copiez votre fichier "portfolio" de type de publication personnalisé quelque part, enregistrez-le. appelez-le par exemple portfolio_post_typeBACKUP.php

3 Vous êtes maintenant sûr de l'échec de cette méthode. vous pouvez le récupérer.

4 Changer " portefeuille " en " projets "

5 Importez les articles avec le plugin et l'alto!

J'espère que cela fonctionne.

Wesley Cheung
la source
Ah, désolé aurait dû mentionner. Il y a déjà beaucoup de messages portfolio.
Desi
j'ai édité la réponse. bonne chance!
Wesley Cheung le
Ceci est un plugin fantastique!
realph
1
ce plugin ne fonctionne plus correctement. je l'ai essayé et cela n'a pas changé tous les «anciens» types de messages. mais la solution mysql (réponse de Will) fonctionne très bien.
honk31
Le plugin n'a pas été mis à jour depuis deux ans.
rhand
18

Vous pouvez également le faire directement avec 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'

Deux choses à noter:

  1. Vous devrez mettre à jour toutes les références à ce type de message dans votre code (par exemple, les modèles, les définitions CMB2 ou les définitions de taxonomie).
  2. Si vous avez stocké des références à ce type de publication dans des wp_postmetatableaux sérialisés, vous ne voulez pas faire une simple MISE À JOUR / REMPLACER car cela les ferait exploser! Eh bien, à moins que les chaînes de type nouveau et ancien ne soient exactement de la même longueur.
Volonté
la source
7

Etendre la réponse de Will un peu plus loin ..., et surtout si vous le faites depuis votre 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 modification ici consiste à ne pas remplacer directement l'ancien type dans le GUID, mais à remplacer uniquement si "post_type = old_type" ou "/ old_type /" est présent. Cela évite de remplacer par erreur des slugs valides. (par exemple, votre type de publication personnalisé est portfolio, et le slug d'une page contient également un portfolio)

Une autre alternative consiste à faire quelque chose comme ceci:

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
la source
Merci. Cela marche. Une chose mineure: la dernière partie de la deuxième requête de la boucle doit être "% post_type = {$ old_type}%", pas "% post_type = {$ type}%".
Betty
3

Utilisez une requête de base de données WordPress mais n'oubliez pas les données d'options sérialisées

La méthode qui a fonctionné pour moi était de faire une recherche et de remplacer dans la base de données WordPress, mais en veillant à ne pas bousiller les données d'options sérialisées dans le processus. La meilleure façon que j'ai trouvée est d'utiliser l' utilitaire de recherche et de remplacement de base de données sécurisé à partir d'interconnect / it . Ne faites jamais simplement une requête de type SETpost_type = REPLACE(post_type ,'old_post_type','new_post_type')sans savoir ce que vous faites ou les données sérialisées se briseront car elles conservent une somme de contrôle et ne pourront pas se désérialiser correctement.

Lisez la section Problèmes potentiels avant de suivre aveuglément cette

Étape 1 - Mettez à jour votre base de données en toute sécurité avec un nouveau nom

  1. sauvegardez votre base de données car les modifications suivantes ont un potentiel très réel de la corrompre.
  2. Téléchargez et décompressez l' utilitaire de recherche et de remplacement de base de données d'Interconnect / IT
  3. ajoutez le répertoire extrait à votre racine Web (cela fonctionne également dans les sous-répertoires)
  4. accédez au répertoire, par exemple: /mywebsite.com/path/to/utility/directory/
  5. suivre les indications. cliquez sur 'dry-run' si vous êtes paranoïaque pour voir les changements (il y en aura des centaines si vous avez même quelques messages du type de message modifié)
  6. cliquez sur «live run» pour finaliser les modifications.
  7. supprimer le répertoire de recherche sécurisé de votre répertoire wordpress car c'est un problème de sécurité

Étape 2 - Réinitialisez vos liens permanents

Si vous utilisez des permaliens, les mises à jour de votre base de données visseront vos redirections vers vos types de publication personnalisés. Il existe cependant une solution facile, il suffit d'aller dans les paramètres / permaliens de WordPress et de noter le paramètre actuel (le mien était 'nom du message'). Revenez ensuite à la valeur par défaut, cliquez sur «enregistrer», puis revenez au paramètre précédent, puis enregistrez à nouveau. Vous venez de corriger vos problèmes de redirection.

Étape 3 - Renommer les modèles de type de publication personnalisés de votre thème

Si vous êtes comme moi et que vous avez créé des modèles de type de publication personnalisés, vous devrez les renommer ou vos publications personnalisées auront l'air foirées. Accédez simplement à votre thème et recherchez tout fichier qui a votre ancien nom de type de publication dans son nom de fichier et renommez le fichier en utilisant votre nouveau nom de publication. Par exemple, j'ai dû changer single-project-portfolio.phppour single-before-after.phpquand j'ai changé mon type de message de project-portfolioà before-after.

Étape 5 - Mettre à jour n'importe quel code

Effectuez une recherche de fichier et remplacez votre ancien nom de type de publication personnalisé dans le dossier thème et plugins. Pour moi, j'avais plusieurs shortcodes personnalisés qui dépendaient de la décision d'utiliser ou non l'un de mes types de publication personnalisés.

Tout tester

Problèmes potentiels (à lire avant de commencer cette procédure)

Problèmes de syndication

Si vos types de messages personnalisés ont été syndiqués, sachez que votre recherche initiale et votre remplacement modifieront également les guides de vos messages, ce qui forcera tous les abonnés à voir les anciens messages comme de nouveaux. Je n'ai pas eu à gérer cela, mais si vous en avez besoin, envisagez de choisir manuellement les tables que l'utilitaire de recherche sécurisée traite, puis mettez à jour manuellement toutes les données non sérialisées à l'aide de la requête suivante:

SET `post_type` = REPLACE(`post_type`,'old_post_type','new_post_type')
WHERE `post_type` LIKE '%old_post_type%';
AndrewD
la source
très soigné pour lister tout cela. sauf que la requête SQL à la fin n'est pas terminée, car vous avez oublié le guid, mais ils sont répertoriés dans la réponse de Wills. De plus, je n'irais pas avec WHERE 'post_type' LIKE '%old_post_type%', j'utiliserais WHERE 'post_type' = 'old_post_type', car votre chemin pourrait également entraîner la modification d'autres post-types.
honk31
0

Je n'ai pas la réputation de commenter donc je mettrai ceci ici. Prolonger l'exemple de Will. J'ai changé les LIKE en "=" et les ai tous deux pointés vers OEREpost_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'

N'oubliez pas non plus d'aller dans Admin> Paramètres> Permaliens et cliquez sur "Enregistrer les modifications". Sinon, vos liens seront probablement rompus.

Vous devrez également modifier tous les noms de modèle de type "post-unique".

Cela devrait être tout ce que vous devez faire.

Bullyen
la source
0

Voici un moyen très simple:

  1. Exécutez l'exportateur Wordpress (Outils> Exporter) - exportez uniquement le type de publication dont vous souhaitez modifier le nom
  2. Ouvrez le fichier .xml généré et remplacez toutes les mentions de l'ancien nom du type de publication par le nouveau nom (dans la méta "custom_post_type" ainsi que dans le champ de permalien)
  3. Créez votre nouveau type de publication avec le même nom que dans le .xml modifié (mais conservez toujours l'ancien en cas d'échec)
  4. Importez le fichier .xml édité via l'importateur Wordpress (plugin disponible directement depuis Outils> Importer)
  5. Vérifiez que le contenu est présent dans le nouveau type de message, puis supprimez l'ancien
Dagobert Renouf
la source