Cum schimb în siguranță numele unui tip de postare personalizat?
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;
}
}

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:
- 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).
- 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.

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();

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}%".

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/%';

Iată o metodă foarte simplă:
- Rulează Exportorul WordPress (Unelte > Export) - exportează doar tipul de articol căruia vrei să-i schimbi numele
- 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)
- 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)
- Importă fișierul .xml editat prin Importorul WordPress (plugin disponibil direct din Unelte > Import)
- Verifică dacă conținutul este prezent în noul tip de articol și apoi elimină-l pe cel vechi

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

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!

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 SET
post_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
- fă o copie de rezervă a bazei de date deoarece următoarele modificări au un potențial real de a o corupe.
- descarcă și dezarhivează utilitarul sigur de căutare și înlocuire în baza de date de la interconnect/it
- adaugă directorul extras în root-ul site-ului tău (funcționează și în subdirectoare)
- accesează directorul în browser, de ex: /mywebsite.com/calea/catre/utilitar/director/
- 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)
- apasă 'live run' pentru a finaliza modificările.
- ș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 sindicalizareDacă 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%';

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..

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ă.

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.

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.
