¿Cómo puedo cambiar de forma segura el nombre de un tipo de publicación personalizada?

15

Hice un tipo de publicación personalizada llamada 'cartera' pero quiero cambiarla a 'proyectos'. ¿Cuáles serían los pasos exactos que debo seguir 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 publicaciones en portfolio , por lo que no puedo cambiar portfolio con 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;
    }
}
    
pregunta Desi 24.04.2013 - 09:20

6 respuestas

2

Si aún no tiene publicaciones en su cartera.

Sería muy simple. Renombra todo con "Portafolio" en "Proyectos". No perderás nada y cambiarás el nombre.

Editar:

Intente usar este complemento enlace para exportar las publicaciones actuales de forma segura e importarlas en su nuevo tipo de publicación personalizada.

Así que los pasos son:

1 Descargue y use el complemento: enlace

2 Copie su archivo de "cartera" de tipo de publicación personalizado en algún lugar donde desee guardar. llámelo por ejemplo portfolio_post_typeBACKUP.php

3 Ahora está seguro de cuándo falla este método. puedes recuperarlo.

4 Cambia " cartera " a " proyectos "

5 ¡Importa las publicaciones con el complemento y la viola!

Espero que esto funcione.

    
respondido por el Wesley Cheung 24.04.2013 - 09:34
16

También puedes 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 de CMB2 o definiciones de taxonomía).
  2. Si ha almacenado alguna referencia a este tipo de publicación dentro de wp_postmeta dentro de arreglos serializados, ¡no quiere hacer una simple ACTUALIZACIÓN / REEMPLAZO porque los hará estallar! Bueno, a menos que tanto las cadenas de tipo de entrada nuevas como las antiguas tengan la misma longitud.
respondido por el Will 13.01.2014 - 05:42
6

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, pero reemplazar solo si "post_type = old_type" o "/ old_type /" está presente. Esto evita el reemplazo de babosas válidas por error. (por ejemplo, su tipo de publicación personalizada es la cartera, y la barra de una página también tiene una 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!

    
respondido por el Nirav Mehta 17.07.2014 - 08:11
2

Use una consulta de base de datos de WordPress pero no se olvide de los datos de opción serializados

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

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

Paso 1: actualice de forma segura su base de datos con un nuevo nombre

  1. haga una copia de seguridad de su base de datos porque los siguientes cambios tienen un potencial muy real de corromperla.
  2. descargue y descomprima la búsqueda segura y reemplace la utilidad de la base de datos desde interconnect / it
  3. agregue el directorio extraído a su webroot (también funciona en subdirectorios)
  4. vaya al directorio, por ejemplo: /mywebsite.com/path/to/utility/directory/
  5. sigue las instrucciones. haga clic en "ejecutar en seco" si está paronoideo para ver los cambios (habrá cientos si tiene algunas publicaciones del tipo de publicación modificada)
  6. haga clic en 'live run' 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á usando permalinks, las actualizaciones de su base de datos arruinarán sus redirecciones a sus tipos de publicaciones personalizadas. Sin embargo, hay una solución fácil, solo ingrese a la configuración de WordPress / permalinks 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 y luego vuelva a guardar. Acabas de arreglar tus problemas de redireccionamiento.

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

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

Paso 5 - Actualizar cualquier código

Realice una búsqueda de archivos y reemplace su antiguo nombre de tipo de publicación personalizada en el tema y la carpeta de complementos. Para mí, tenía varios códigos cortos personalizados que se basaban en tomar una decisión sobre si estaba usando uno de mis tipos de publicación personalizados.

Prueba todo

Problemas potenciales (lea antes de comenzar este procedimiento)

Problemas de sindicación

Si sus tipos de publicaciones personalizadas estaban sindicados, 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 lo necesita, considere la posibilidad de elegir manualmente las tablas que procesa la utilidad safesearch y luego actualizar manualmente los datos no serializados mediante la siguiente consulta:

SET 'post_type' = REPLACE('post_type','old_post_type','new_post_type')
WHERE 'post_type' LIKE '%old_post_type%';
    
respondido por el AndrewD 17.04.2015 - 21:58
0

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

También recuerde entrar en el Administrador > Configuraciones > Permalinks y pulsa "Guardar cambios". De lo contrario, es probable que se rompan tus enlaces.

También deberá editar los nombres de las plantillas de 'un único post'.

Esto debería ser todo lo que necesitas hacer.

    
respondido por el Bullyen 22.10.2014 - 16:31
0

Aquí hay una manera muy simple:

  1. Ejecute el exportador de Wordpress (Herramientas > Exportar): solo exporte el tipo de publicación cuyo nombre desee cambiar
  2. Abra el archivo .xml generado y reemplace todas las menciones del nombre del tipo de publicación anterior 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 mantenga el anterior en caso de que falle)
  4. Importe el archivo .xml editado a través de Wordpress Importer (complemento disponible directamente desde Herramientas > Importar)
  5. Verifique que el contenido esté presente en el nuevo tipo de publicación y luego elimine el anterior
respondido por el Dagobert Renouf 09.11.2015 - 18:22

Lea otras preguntas en las etiquetas