web-dev-qa-db-fra.com

Comment changer en toute sécurité le nom d'un type de message personnalisé?

J'ai créé un type de message personnalisé appelé "portfolio", mais je souhaite le modifier en "projets". Quelles sont les étapes exactes que je dois suivre pour modifier 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, donc je ne peux 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;
    }
}
18
Desi

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

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

Modifier:

Essayez d’utiliser ce plugin http://wordpress.org/extend/plugins/ptypeconverter/ 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 plugin: http://wordpress.org/extend/plugins/ptypeconverter/

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

3 Vous êtes maintenant sûr lorsque cette méthode échoue. vous pouvez le récupérer.

4 Changer " portfolio " en " projets "

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

J'espère que ça marche.

2
Wesley Cheung

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 toutes 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 de message dans wp_postmeta dans des tableaux sérialisés, vous ne voulez pas effectuer une simple mise à jour/remplacement, car cela les fera exploser! Eh bien, à moins que les nouvelles et les anciennes chaînes de type publication aient exactement la même longueur.
18
Will

Prolonger 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 est de ne pas remplacer directement l'ancien type dans le guid, mais seulement 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 ça:

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!

6
Nirav Mehta

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 fonction safe et de remplacer l’utilitaire de base de données d’interconnect/it . Ne vous contentez jamais de faire une requête de type SETpost_type= REPLACE(post_type,'old_post_type','new_post_type') sans savoir ce que vous faites, sinon les données sérialisées se briseraient, 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 recherchez en toute sécurité et remplacez 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. accédez au répertoire, par exemple: /mon siteweb.com/path/to/utility/directory/
  5. suivre les indications. 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é de votre répertoire wordpress car c'est un problème de sécurité.

Étape 2 - Réinitialiser vos liens permanents

Si vous utilisez des liens permanents, 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 l'air foirés. Il suffit d'aller dans votre thème et de rechercher tout fichier contenant le nom de votre ancien type d'article dans son nom de fichier et renommer le fichier en utilisant 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 - Mettre à jour n'importe quel 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 abrégés 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 commencer cette procédure)

Si vos types de messages personnalisés ont été syndiqués, sachez que votre recherche initiale et leur remplacement modifieront également les indicateurs de vos messages, ce qui obligera tous les abonnés à voir les anciens messages comme des nouveaux. 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 de mettre à 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%';
2
AndrewD

Je n'ai pas la réputation de commenter, alors je vais mettre ça ici. Prolonger l'exemple de Will. J'ai changé les LIKEs en "=" 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'

Pensez également à aller dans Admin> Paramètres> Permaliens et cliquez sur "Enregistrer les modifications". Sinon, vos liens seront probablement cassés.

Vous devrez également éditer tout nom de modèle "single-post-type".

Cela devrait être tout ce que vous devez faire.

0
Bullyen

Voici un moyen très simple:

  1. Exécuter l’Exportateur Wordpress (Outils> Exporter) - n’exportez que le type de publication pour lequel vous souhaitez modifier le nom.
  2. 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 "custom_post_type" ainsi que dans le champ permalink)
  3. Créez votre nouveau type de message avec le même nom que dans le fichier .xml modifié (tout en conservant l'ancien en cas d'échec)
  4. Importez le fichier .xml modifié via Wordpress Importer (plug-in disponible directement dans Outils> Importer)
  5. Vérifiez que le contenu est présent dans le nouveau type de message, puis supprimez l'ancien
0
Dagobert Renouf