¿Cómo cambio con seguridad el nombre de un tipo de publicación personalizado?

19

Hice un tipo de publicación personalizado llamado 'portafolio' pero quiero cambiarlo a 'proyectos'. ¿Cuáles serían los pasos exactos que debo tomar para cambiar de forma segura el nombre y evitar que las publicaciones de tipo de publicación personalizada desaparezcan en el panel?

Nota: Ya hay envíos en portfoliolo que no puedo acaba de cambiar hacia fuera 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;
    }
}
Desi
fuente
¿Qué tal reemplazar solo las etiquetas?
Bainternet
¿Solo las etiquetas? No estoy seguro de lo que quieres decir exactamente, pero preferiría cambiarlo completamente.
Desi

Respuestas:

2

Si aún no tiene publicaciones en su cartera.

Sería realmente simple Cambie el nombre de todo con "Portafolio" a "Proyectos". No perderá nada y cambiará el nombre.

Editar:

Intente usar este plugin http://wordpress.org/extend/plugins/ptypeconverter/ para exportar las publicaciones actuales de manera segura e importarlas a su nuevo tipo de publicación personalizada.

Entonces los pasos son:

1 Descargue y use el complemento: http://wordpress.org/extend/plugins/ptypeconverter/

2 Copie el archivo "portfolio" de tipo de publicación personalizado en algún lugar y guárdelo. llámelo por ejemplo portfolio_post_typeBACKUP.php

3 Ahora está seguro cuando este método falla. Puedes recuperarlo.

4 Cambiar " cartera " en " proyectos "

5 ¡ Importa las publicaciones con el complemento y viola!

Espero que esto funcione.

Wesley Cheung
fuente
Ah, lo siento debería haber mencionado. portfolioYa hay muchas publicaciones .
Desi
Edité la respuesta. ¡buena suerte!
Wesley Cheung el
Este es un complemento fantástico!
realph
1
Este complemento ya no funciona correctamente. Lo probé y no cambió todos los tipos de publicaciones "antiguas". pero la solución mysql (respuesta de Will) funciona bien.
honk31
El complemento no se ha actualizado en dos años.
Rhand
18

También puede hacer esto directamente 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'

Dos cosas a tener en cuenta:

  1. Deberá actualizar cualquier referencia a este tipo de publicación en su código (por ejemplo, plantillas, definiciones CMB2 o definiciones de taxonomía).
  2. Si ha almacenado alguna referencia a este tipo de publicación dentro de wp_postmetamatrices serializadas, ¡no desea hacer una ACTUALIZACIÓN / REEMPLAZO simple porque las explotará! Bueno, a menos que las cadenas de tipo de publicación nuevas y antiguas tengan exactamente la misma longitud.
Será
fuente
7

Extendiendo la respuesta de Will un poco más ..., y especialmente si lo está haciendo desde su complemento:

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}/%" ) );
}

El cambio aquí es no reemplazar el tipo antiguo en el guid directamente, sino reemplazarlo solo si "post_type = old_type" o "/ old_type /" está presente. Esto evita reemplazar babosas válidas por error. (por ejemplo, su tipo de publicación personalizada es cartera, y la babosa de una página también tiene cartera)

Otra alternativa es hacer algo como esto:

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
fuente
Gracias. Esto funciona. Una cosa menor: la última parte de la segunda consulta en el bucle debe ser "% post_type = {$ old_type}%", no "% post_type = {$ type}%".
Betty
3

Use una consulta de base de datos de WordPress pero no se olvide de los datos de opciones serializadas

El método que funcionó para mí fue hacer una búsqueda y reemplazar dentro de la base de datos de WordPress, pero asegurándome de no arruinar los datos de las opciones serializadas en el proceso. La mejor forma que he encontrado es usar la búsqueda segura y reemplazar la utilidad de base de datos de interconexión / it . Nunca haga una consulta de tipo SETpost_type = REPLACE(post_type ,'old_post_type','new_post_type')sin saber lo que está haciendo o los datos serializados se romperán, ya que mantiene una suma de verificación y no podrá serserializar correctamente.

Lea la sección Problemas potenciales antes de seguir ciegamente esto

Paso 1 - Actualice de forma segura su base de datos con un nuevo nombre

  1. respalde su base de datos porque los siguientes cambios tienen un potencial muy real para corromperla.
  2. descargue y descomprima la búsqueda segura y reemplace la utilidad de base de datos de interconexión / it
  3. agregue el directorio extraído a su raíz web (también funciona en subdirectorios)
  4. vaya al directorio, por ejemplo: /mywebsite.com/path/to/utility/directory/
  5. seguir direcciones. haga clic en 'ejecución en seco' si es paronoide para ver los cambios (habrá cientos si incluso tiene algunas publicaciones del tipo de publicación modificado)
  6. haga clic en "ejecución en vivo" para finalizar los cambios.
  7. elimine el directorio de búsqueda segura de su directorio de wordpress ya que es un problema de seguridad

Paso 2 - Restablece tus enlaces permanentes

Si está utilizando enlaces permanentes, las actualizaciones de su base de datos arruinarán sus redireccionamientos a sus tipos de publicaciones personalizadas. Sin embargo, hay una solución fácil, solo vaya a la configuración / enlaces permanentes de WordPress y observe la configuración actual (la mía era 'nombre de la publicación'). Luego vuelva a los valores predeterminados, haga clic en 'guardar', luego vuelva a la configuración anterior, luego guarde nuevamente. Acaba de solucionar sus problemas de redireccionamiento.

Paso 3: cambie el nombre de las plantillas de tipo de publicación personalizada de su tema

Si eres como yo y creaste plantillas de tipo de publicación personalizadas, deberás cambiarles el nombre o tus publicaciones personalizadas se verán arruinadas. Simplemente vaya a su tema y busque cualquier archivo que tenga su antiguo nombre de tipo de publicación en su nombre de archivo y cambie el nombre del archivo usando su nuevo nombre de publicación. Por ejemplo, tuve que cambiar single-project-portfolio.phpa single-before-after.phpcuando cambié mi tipo de publicación de project-portfolioa before-after.

Paso 5 - Actualice cualquier código

Haga una búsqueda de archivos y reemplácelos por su antiguo nombre de tipo de publicación personalizada en la carpeta de tema y complementos. Para mí, tenía varios códigos cortos personalizados que dependían de tomar una decisión sobre si estaba usando uno de mis tipos de publicaciones personalizadas.

Prueba todo

Posibles problemas (lea antes de comenzar este procedimiento)

Problemas de sindicación

Si sus tipos de publicaciones personalizadas se sindicaron, tenga en cuenta que su búsqueda y reemplazo iniciales también cambiarán las guías de sus publicaciones, lo que obligará a todos los suscriptores a ver las publicaciones antiguas como nuevas. No tuve que lidiar con esto, pero si es necesario, considere elegir manualmente las tablas que procesa la utilidad safesearch, luego actualice manualmente los datos no serializados utilizando la siguiente consulta:

SET `post_type` = REPLACE(`post_type`,'old_post_type','new_post_type')
WHERE `post_type` LIKE '%old_post_type%';
AndrewD
fuente
muy ordenado para enumerar todo esto. excepto que la consulta sql al final no está completa, ya que olvidó el guid, pero se enumeran en la respuesta de Wills. además de que no iría con WHERE 'post_type' LIKE '%old_post_type%', me gustaría utilizar WHERE 'post_type' = 'old_post_type', ya que su forma podría también causar algún otro post-tipos, para cambiar ..
honk31
0

No tengo la reputación de comentar, así que pondré esto aquí. Extendiendo el ejemplo de Will. Cambié los LIKE a "=" y los dos apuntan a DONDEpost_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'

También recuerde ir a Admin> Configuración> Enlaces permanentes y presione "Guardar cambios". De lo contrario, es probable que tus enlaces se rompan.

También deberá editar los nombres de plantilla de 'tipo de publicación única'.

Esto debería ser todo lo que necesitas hacer.

Bullyen
fuente
0

Aquí hay una forma realmente simple:

  1. Ejecute el Exportador de Wordpress (Herramientas> Exportar): solo exporte el tipo de publicación que desea cambiar el nombre de
  2. Abra el archivo .xml generado y reemplace todas las menciones del antiguo nombre del tipo de publicación por el nuevo nombre (en el meta "custom_post_type", así como en el campo de enlace permanente)
  3. Cree su nuevo tipo de publicación con el mismo nombre que en el .xml editado (pero aún conserve el anterior en caso de que falle)
  4. Importe el archivo .xml editado a través del Importador de Wordpress (complemento disponible directamente desde Herramientas> Importar)
  5. Verifique que el contenido esté presente en el nuevo tipo de publicación y luego elimine el antiguo
Dagobert Renouf
fuente