Cum schimb în siguranță numele unui tip de postare personalizat?

24 apr. 2013, 10:20:46
Vizualizări: 50.6K
Voturi: 30

Am creat un tip de postare personalizat numit 'portfolio' dar vreau să-l schimb în 'projects'. Care sunt pașii exacți pe care trebuie să-i urmez pentru a schimba în siguranță numele și a preveni dispariția postărilor personalizate din panoul de administrare?

Notă: Există deja postări în portfolio așa că nu pot doar să înlocuiesc portfolio cu projects.

/* Înregistrare Tip Postare Portfolio */
add_action('init', 'create_portfolio');

function create_portfolio() {

    $labels = array(
        'name' => __('Portofoliu', 'nume general tip postare'),
        'singular_name' => __('Proiect', 'nume singular tip postare'),
        'add_new' => __('Adaugă Nou', 'element portofoliu'),
        'add_new_item' => __('Adaugă Proiect Nou'),
        'edit_item' => __('Editează Proiect'),
        'new_item' => __('Proiect Nou'),
        'view_item' => __('Vizualizează Proiect'),
        'search_items' => __('Caută Proiecte'),
        'not_found' =>  __('Nu s-a găsit nimic'),
        'not_found_in_trash' => __('Nu s-a găsit nimic în Coș'),
        '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 );
}

/* Înregistrare Taxonomie Abilități */
register_taxonomy("Skills", array("portfolio"), array("hierarchical" => true, "label" => "Abilități", "singular_label" => "Abilitate", "rewrite" => true));

/* Adăugare Câmpuri */
add_action("admin_init", "add_portfolio_fields");

function add_portfolio_fields(){
    add_meta_box("website_url", "URL Website", "website_url", "portfolio", "side", "low");
    add_meta_box("view_more", "Vezi Mai Mult", "view_more", "portfolio", "side", "low");
    add_meta_box("screenshot_name", "Nume Captură Ecran", "screenshot_name", "portfolio", "side", "low");
    add_meta_box("thumbnail_name", "Nume Miniatură", "thumbnail_name", "portfolio", "side", "low");
    add_meta_box("thumbnail_alt", "Text Alternativ Miniatură", "thumbnail_alt", "portfolio", "side", "low");
}

function website_url(){
    global $post;
    $custom = get_post_custom($post->ID);
    $website_url = $custom["website_url"][0];
    ?>
    <label>URL Website:</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>Vezi Mai Mult:</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>Nume Captură Ecran:</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>Nume Miniatură:</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>Text Alternativ Miniatură:</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"]);
}

/* Coloane Personalizate */
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" => "Titlu Proiect",
        "description" => "Descriere",
    );

    return $columns;
}

function portfolio_custom_columns($column){
    global $post;

    switch ($column) {
        case "description":
        the_excerpt();
        break;
    }
}
2
Comentarii

ce zici să înlocuim doar etichetele?

Bainternet Bainternet
24 apr. 2013 10:26:01

Doar etichetele? Nu sunt sigur exact ce vrei să spui, dar aș prefera să le schimbăm complet pe toate.

Desi Desi
24 apr. 2013 10:29:44
Toate răspunsurile la întrebare 6
0
29

Puteți face acest lucru direct și prin MySQL.

UPDATE `wp_posts`
SET 
    # Actualizează coloana post_type
    `post_type` = REPLACE(`post_type`,'nume_vechi_tip_postare','nume_nou_tip_postare'),
    # Actualizează URL-urile
    `guid` = REPLACE(`guid`,'nume_vechi_tip_postare','nume_nou_tip_postare')
WHERE `post_type` = 'nume_vechi_tip_postare'

Două aspecte de reținut:

  1. Va trebui să actualizați orice referințe la acest tip de postare în codul vostru (de exemplu, în șabloane, definiții CMB2 sau definiții de taxonomii).
  2. Dacă aveți stocate referințe la acest tip de postare în tabelele wp_postmeta în cadrul unor array-uri serializate, nu recomandăm să faceți un simplu UPDATE/REPLACE deoarece le veți distruge! Bine, cu excepția cazului în care atât noul cât și vechiul șir al tipului de postare au exact aceeași lungime.
13 ian. 2014 06:42:27
2

Extinzând răspunsul lui Will un pic mai departe..., și mai ales dacă faci asta din plugin-ul tău:

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={$old_type}%" ) );
    $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->posts} SET guid = REPLACE(guid, %s, %s) 
                         WHERE guid LIKE %s", "/{$old_type}/", "/{$type}/", "%/{$old_type}/%" ) );
}

Modificarea aici este să nu înlocuim tipul vechi în guid direct, ci doar dacă există "post_type=old_type" sau "/old_type/". Asta evită înlocuirea accidentală a slug-urilor valide. (de ex. dacă custom post type-ul tău este "portfolio", și un slug de pagină conține și el "portfolio")

O alternativă este să faci ceva de genul:

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();
17 iul. 2014 09:11:37
Comentarii

Mulțumesc. Funcționează. Un mic detaliu: ultima parte a celei de-a doua interogări din buclă ar trebui să fie "%post_type={$old_type}%", nu "%post_type={$type}%".

Betty Betty
21 dec. 2019 05:15:31

Am convertit interogările wpdb în interogări SQL simple pentru a simplifica.


UPDATE wp_posts SET post_type = REPLACE(post_type, old_type, type) WHERE post_type LIKE '%old_type%';

UPDATE wp_posts SET guid = REPLACE(guid, 'post_type=old_type', 'post_type=type') WHERE guid LIKE '%post_type=old_type%';

UPDATE wp_posts SET guid = REPLACE(guid, '/old_type/', '/type/') WHERE guid LIKE '%/old_type/%';

Ahmad Wael Ahmad Wael
3 apr. 2023 21:46:41
2

Iată o metodă foarte simplă:

  1. Rulează Exportorul WordPress (Unelte > Export) - exportează doar tipul de articol căruia vrei să-i schimbi numele
  2. Deschide fișierul .xml generat și înlocuiește toate mențiunile vechiului nume al tipului de articol cu noul nume (atât în meta "custom_post_type" cât și în câmpul permalink)
  3. Creează noul tău tip de articol cu același nume ca în fișierul .xml editat (dar păstrează-l totuși pe cel vechi pentru cazul în care nu reușește)
  4. Importă fișierul .xml editat prin Importorul WordPress (plugin disponibil direct din Unelte > Import)
  5. Verifică dacă conținutul este prezent în noul tip de articol și apoi elimină-l pe cel vechi
9 nov. 2015 19:22:23
Comentarii

Ideea foarte inteligentă. Recomandat pentru cei care nu doresc să atingă baza de date

kanlukasz kanlukasz
23 apr. 2020 19:32:18

Mulțumesc pentru asta... Am urmărit și conversația de aici pentru a iniția un nou tip de postare personalizată: https://wordpress.stackexchange.com/a/252078/142039 -- am reușit să import toate datele mele, minunat!

twk twk
13 apr. 2021 09:43:24
1

Folosește o interogare în baza de date WordPress dar nu uita de datele de opțiuni serializate

Metoda care a funcționat pentru mine a fost să efectuez o căutare și înlocuire în baza de date WordPress, dar asigurându-mă că nu stric datele de opțiuni serializate în acest proces. Cea mai bună metodă pe care am găsit-o este să utilizez utilitarul sigur de căutare și înlocuire în baza de date de la interconnect/it. Niciodată nu faceți o interogare de tip SETpost_type= REPLACE(post_type,'old_post_type','new_post_type') fără să știți ce faceți, altfel datele serializate se vor corupe deoarece acestea păstrează un checksum și nu vor putea fi deserializate corect.

Citește secțiunea cu Probleme Potențiale înainte de a urma orbește acest ghid

Pasul 1 - Actualizează în siguranță baza de date cu noul nume

  1. fă o copie de rezervă a bazei de date deoarece următoarele modificări au un potențial real de a o corupe.
  2. descarcă și dezarhivează utilitarul sigur de căutare și înlocuire în baza de date de la interconnect/it
  3. adaugă directorul extras în root-ul site-ului tău (funcționează și în subdirectoare)
  4. accesează directorul în browser, de ex: /mywebsite.com/calea/catre/utilitar/director/
  5. urmează instrucțiunile. dacă ești paranoic, apasă 'dry-run' pentru a vedea modificările (vor fi sute dacă ai chiar și câteva postări de tipul modificat)
  6. apasă 'live run' pentru a finaliza modificările.
  7. șterge directorul safe search din directorul WordPress deoarece reprezintă o problemă de securitate

Pasul 2 - Resetează legaturile permanente (permalinks)

Dacă utilizezi legături permanente, actualizările din baza de date vor strica redirecționările către tipurile tale personalizate de postări. Există însă o soluție simplă: intră în setările WordPress/legături permanente și notează setarea curentă (la mine era 'numele postării'). Apoi treci înapoi la setarea implicită, apasă 'salvează', apoi revino la setarea anterioară și salvează din nou. Tocmai ai rezolvat problemele de redirecționare.

Pasul 3 - Redenumește șabloanele de tipuri de postări personalizate din tema ta

Dacă ești ca mine și ai creat șabloane personalizate pentru tipuri de postări, va trebui să le redenumești altfel postările tale personalizate vor arăta stricate. Intră în tema ta și găsește orice fișier care conține vechiul nume al tipului de postare în numele său și redenumește fișierul folosind noul nume. De exemplu, a trebuit să schimb single-project-portfolio.php în single-before-after.php când am schimbat tipul de postare din project-portfolio în before-after.

Pasul 5 - Actualizează orice cod

Efectuează o căutare și înlocuire a vechiului nume al tipului de postare personalizată în directorul temei și al plugin-urilor. În cazul meu, aveam mai multe shortcode-uri personalizate care se bazau pe verificarea tipului de postare personalizată.

Testează totul

Probleme potențiale (citește înainte de a începe această procedură)

Probleme de sindicalizare

Dacă tipurile tale de postări personalizate au fost sindicalizate, fii conștient că căutarea și înlocuirea inițială vor schimba și GUID-urile postărilor tale, ceea ce va forța toți abonații să vadă postările vechi ca fiind noi. Nu a trebuit să mă confrunt cu asta, dar dacă ai nevoie, atunci consideră să alegi manual tabelele pe care le procesează utilitarul safesearch, apoi actualizează manual orice date neserializate folosind următoarea interogare:

SET `post_type` = REPLACE(`post_type`,'old_post_type','new_post_type')
WHERE `post_type` LIKE '%old_post_type%';
17 apr. 2015 22:58:53
Comentarii

foarte util să listezi toate acestea. cu excepția faptului că interogarea SQL de la final nu este completă, deoarece ai uitat despre guid, dar acestea sunt enumerate în răspunsul lui Will. în plus, nu aș folosi WHERE 'post_type' LIKE '%old_post_type%', ci aș folosi WHERE 'post_type' = 'old_post_type', deoarece abordarea ta ar putea duce la modificarea altor tipuri de postări..

honk31 honk31
5 ian. 2017 11:27:39
5

Dacă nu ai încă postări în portofoliul tău.

Ar fi foarte simplu. Redenumește tot ce este "Portfolio" în "Proiecte". Nu vei pierde nimic și vei schimba doar denumirea.

Editare :

Încearcă să folosești acest plugin http://wordpress.org/extend/plugins/ptypeconverter/ pentru a exporta în siguranță postările curente și a le importa în noul tip de postare personalizat.

Deci pașii sunt :

1 Descarcă și folosește pluginul : http://wordpress.org/extend/plugins/ptypeconverter/

2 Copiază fișierul tipului de postare personalizat "portfolio" într-un loc sigur. Numeste-l de exemplu portfolio_post_typeBACKUP.php

3 Acum ești sigur că, dacă această metodă nu funcționează, poți recupera totul.

4 Schimbă "portfolio" în "proiecte"

5 Importă postările cu pluginul și voilà!

Sper că funcționează.

24 apr. 2013 10:34:29
Comentarii

Ah, scuze, trebuia să menționez. Există deja multe postări în portfolio.

Desi Desi
24 apr. 2013 10:37:58

am editat răspunsul. mult succes!

Wesley Cheung Wesley Cheung
24 apr. 2013 10:46:27

Acesta este un plugin fantastic!

realph realph
7 ian. 2014 19:47:01

acest plugin nu mai funcționează corect. l-am încercat și nu a schimbat toate tipurile de postări 'vechi'. dar soluția mysql (răspunsul lui Will) funcționează bine.

honk31 honk31
5 ian. 2017 11:09:44

Pluginul nu a fost actualizat de doi ani.

rhand rhand
17 ian. 2017 10:29:01
0

Nu am reputația necesară pentru a comenta așa că voi scrie aici. Extind exemplul lui Will. Am schimbat LIKE-urile cu "=" și le-am făcut pe ambele să se refere la 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'

De asemenea, nu uitați să mergeți în Admin > Setări > Legături permanente și să apăsați "Salvează modificările". Altfel, este posibil ca legăturile voastre să nu funcționeze.

Va trebui de asemenea să editați orice nume de șabloane 'single-post-type'.

Astea ar trebui să fie singurele lucruri pe care trebuie să le faceți.

22 oct. 2014 17:31:40