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

15

J'ai créé un type d'article personnalisé appelé "portfolio" mais je souhaite le modifier en "projets". Quelles seraient les étapes exactes à suivre pour changer le nom en toute sécurité et éviter que les publications de type publication personnalisée ne disparaissent dans le tableau de bord?

Remarque: il y a déjà des publications dans portfolio , je ne peux donc pas simplement échanger portfolio avec 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;
    }
}
    
posée Desi 24.04.2013 - 09:20

6 réponses

2

Si vous n'avez encore aucune publication dans votre portefeuille.

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

Modifier:

Essayez d’utiliser ce plug-in enlace pour exporter les publications actuelles en toute sécurité et les importer dans votre nouveau type de publication personnalisée.

Les étapes sont donc les suivantes:

1 Téléchargez et utilisez le plug-in: enlace

2 : copiez votre fichier de type "portfolio" personnalisé dans un emplacement enregistré. appelez-le par exemple portfolio_post_typeBACKUP.php

3 Vous êtes maintenant certain que cette méthode échoue. vous pouvez le récupérer.

4 Transformez " le portefeuille " en " projets "

.

5 Importez les publications avec le plug-in et l'alto!

J'espère que cela fonctionne.

    
réponse donnée Wesley Cheung 24.04.2013 - 09:34
16

Vous pouvez aussi 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 les références à ce type d'article dans votre code (par exemple, des modèles, des définitions CMB2 ou des définitions de taxonomie).
  2. Si vous avez stocké des références à ce type d'article dans wp_postmeta dans des tableaux sérialisés, vous ne voulez pas effectuer une simple mise à jour / remplacement, car elles les feront exploser! Eh bien, à moins que les nouvelles et anciennes chaînes de type post aient exactement la même longueur.
réponse donnée Will 13.01.2014 - 05:42
6

Étendre 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 uniquement si "post_type = old_type" ou "/ old_type /" est présent. Cela évite de remplacer des slugs valables par erreur. (par exemple, votre type d'article personnalisé est portfolio et le slug d'une page contient aussi un portfolio)

Une autre alternative est de 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!

    
réponse donnée Nirav Mehta 17.07.2014 - 08:11
2

Utilisez une requête de base de données WordPress sans oublier les données d’option sérialisées

La méthode qui a fonctionné pour moi a été de faire une recherche et un remplacement dans la base de données WordPress, mais en veillant à ne pas gâcher les données d’option sérialisées dans le processus. Le meilleur moyen que j’ai trouvé est d’utiliser la la fonction de recherche et de remplacement sécurisée de l'utilitaire de base de données d'interconnect / it . Ne faites jamais une requête de type SET post_type = REPLACE( post_type ,'old_post_type','new_post_type') sans savoir ce que vous faites ou des données sérialisées se casseront, 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 ceci

É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 risquent fort de la corrompre.
  2. téléchargez et décompressez le rechercher et remplacer en toute sécurité l'utilitaire de base de données d'interconnect / it .
  3. ajoutez le répertoire extrait à votre racine Web (cela fonctionne aussi dans les sous-répertoires)
  4. parcourez le répertoire, par exemple: /mywebsite.com/path/to/utility/directory /
  5. suivez les instructions. Cliquez sur "Dry-Run" si vous êtes paronoïde pour voir les changements (il y en aura des centaines si vous avez même quelques posts du type modifié)
  6. cliquez sur "live run" pour finaliser les modifications.
  7. supprimez le répertoire de recherche sécurisée de votre répertoire wordpress car il s'agit d'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 bousilleront vos redirections vers vos types de publication personnalisés. Il existe cependant une solution simple: il suffit d'aller dans les paramètres / permaliens de WordPress et de noter le paramètre actuel (le mien était 'post name'). Revenez ensuite aux valeurs par défaut, cliquez sur "Enregistrer", puis sur le paramètre précédent, puis sauvegardez à nouveau. Vous venez de résoudre vos problèmes de redirection.

Étape 3 - Renommez les modèles de type de message personnalisé de votre thème

Si vous êtes comme moi et que vous avez créé des modèles de type d'article personnalisé, vous devrez les renommer, sinon vos articles personnalisés auront foiré. Il suffit d'aller dans votre thème et de rechercher tout fichier contenant le nom de votre ancien type d'article et de le renommer à l'aide de votre nouveau nom d'article. Par exemple, je devais changer single-project-portfolio.php en single-before-after.php lorsque je changeais le type de message de project-portfolio à before-after .

Étape 5 - Mettez à jour tout code

Faites une recherche de fichier et remplacez votre ancien nom de type d'article personnalisé dans le dossier theme and plugins. Pour moi, plusieurs codes courts personnalisés 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 lancer cette procédure)

Problèmes de syndication

Si vos types de publication personnalisés ont été syndiqués, sachez que votre recherche initiale et leur remplacement vont également modifier les indicateurs de vos publications, ce qui obligera tous les abonnés à voir les anciennes publications en tant que nouvelles. Je n'avais pas à gérer cela, mais si vous en aviez besoin, envisagez de choisir manuellement les tables traitées par l'utilitaire safesearch, puis mettez à jour manuellement 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%';
    
réponse donnée AndrewD 17.04.2015 - 21:58
0

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

N'oubliez pas non plus d'aller dans l'administrateur > Paramètres > Permalinks et cliquez sur "Enregistrer les modifications". Sinon, vos liens seront probablement cassés.

Vous aurez également besoin de modifier tout nom de modèle "single-post-type".

Cela devrait être tout ce que vous devez faire.

    
réponse donnée Bullyen 22.10.2014 - 16:31
0

Voici un moyen très simple:

  1. Exécuter l'exportateur Wordpress (Outils & Exporter) - exportez uniquement le type de publication pour lequel vous souhaitez modifier le nom
  2. .
  3. Ouvrez le fichier .xml généré et remplacez toutes les mentions de l'ancien nom de type d'article par le nouveau nom (dans la méta "type_post_personnalisé" ainsi que dans le champ permalien)
  4. Créez votre nouveau type de publication avec le même nom que dans le fichier .xml modifié (tout en conservant l'ancien en cas d'échec)
  5. Importez le fichier .xml modifié par le biais de Wordpress Importer (plug-in disponible directement dans Outils> Importer)
  6. Vérifiez que le contenu est présent dans le nouveau type de publication, puis supprimez l'ancien
réponse donnée Dagobert Renouf 09.11.2015 - 18:22

Lire d'autres questions sur les étiquettes