Schimbarea Titlului unei Cutii Meta
Încerc să creez o funcție care să îmi permită să schimb titlul unei cutii meta deja existente (de exemplu, să schimb titlul 'Autori' în 'Echipa', etc.).
Nu am vrut să folosesc JavaScript sau să fiu nevoit să elimin cutia meta originală și să o adaug din nou.
Am început cu următoarea abordare conform unui alt thread care lista codul astfel:
// conectare la acțiunea 'add_meta_boxes'
add_action('add_meta_boxes', 'change_meta_box_titles');
function change_meta_box_titles($post_type, $post)) {
global $wp_meta_boxes; // array cu cutii meta definite
// parcurge array-ul, schimbă titlurile dorite
}
Am rămas blocat la partea de a "parcurge array-ul și de a schimba titlurile dorite".
Care ar fi cea mai bună metodă de a realiza acest lucru? Folosind un foreach pentru buclă? Sau un scenariu Switch/Case? Sunt relativ nou în acest domeniu, poate cineva să ofere un exemplu despre cum să realizez asta?
Actualizare: Exemplul lui Stephen Harris funcționează pentru cutiile meta Core (mulțumesc!):
add_action('add_meta_boxes', 'change_meta_box_titles');
function change_meta_box_titles() {
global $wp_meta_boxes; // array cu cutii meta definite
// parcurge array-ul, schimbă titlurile dorite
$wp_meta_boxes['post']['normal']['core']['authordiv']['title']= 'Membru al echipei';
}
Actualizare: Rezolvat pentru cutii meta personalizate
Pentru a face acest lucru să funcționeze cu cutiile tale meta personalizate, schimbă add_action astfel încât să declanșeze codul de schimbare a titlului după ce cutia meta a fost adăugată:
add_action('add_meta_boxes', 'change_meta_box_titles', 999);

Răspuns Îmbunătățit
Am decis să revin la această întrebare după ce am realizat cât de inutil de hacky era soluția anterioară.
Cea mai bună soluție este să eliminăm metabox-ul și apoi să-l adăugăm din nou, specificând un titlu alternativ. Iată un exemplu pentru post-type-ul post.
add_action( 'add_meta_boxes_post', 'wpse39446_add_meta_boxes' );
function wpse39446_add_meta_boxes() {
remove_meta_box( 'authordiv', 'post', 'core' );
add_meta_box( 'authordiv', __('Membru al Echipei','wpse39446_domain'), 'post_author_meta_box', 'post', 'core', 'high' );
}
Notă: Dacă faceți acest lucru pentru un metabox non-core, va trebui să vă asigurați că callback-ul este apelat după ce metabox-ul este adăugat, specificând o prioritate mai mare.
Deci, $wp_meta_boxes
are o mulțime de array-uri imbricate
Pentru scopurile dumneavoastră:
$wp_meta_boxes['post_type']['normal']['core']['authordiv']['title']= 'echipe';
(NB. Nu sunt sigur dacă sunt transmise argumente la acea acțiune...:
add_action('add_meta_boxes', 'change_meta_box_titles');
function change_meta_box_titles() {
global $wp_meta_boxes; // array de metabox-uri definite
// parcurgeți array-ul, schimbați titlurile dorite
}
De fapt, structura array-ului este mai complicată. Am actualizat codul meu. Am testat acest lucru și funcționează :D (Doar asigurați-vă că schimbați 'post_type'
cu tipul de post, de ex. 'post').
Pe scurt, structura array-ului este post-type > prioritate > core > ID metabox.
Dacă doriți să vedeți array-ul pentru dumneavoastră, folosiți în interiorul funcției:
echo '<pre>';
print_r($wp_meta_boxes);
echo '</pre>';
wp_die('');

Stephen Harris, aș putea să te sărut! A funcționat perfect, îți mulțumesc enorm!
Se pare că am complicat inutil codul meu când încercam să rezolv singur această problemă.

Hmm... Am încercat asta cu o cutie meta personalizată pe care am creat-o. "projectinfo" a fost ID-ul unic al metabox-ului, așa că am încercat...
$wp_meta_boxes['post']['side']['core']['projectinfo']['title']= 'New Title';
dar nu a funcționat. Am omis ceva aici?

Încearcă echo '<pre>';
print_r($wp_meta_boxes);
echo '</pre>';
wp_die('');
După ce ai schimbat titlul pentru a vedea ce nu a funcționat. Presupunerea mea este că nu este 'core' :D

Am adăugat asta, meta personalizat nu apare în listare. Deci, probabil ai dreptate, nu este 'core'.

Mulțumesc pentru acest răspuns și întrebare minunate. Căutam exact același lucru! Mulțumesc din nou. :)

Vezi răspunsul meu mai jos pe această pagină pentru cum să faci mai multe tipuri de postări simultan (WordPress 4.4 și versiuni superioare).

Din câte știu, cea mai bună soluție ar fi să atașezi o funcție la hook-ul dinaintea creării meta box-urilor:
function alter_meta_box_titles( $post_type, $priority, $post )
{
global $wp_meta_boxes;
// Verifică dacă ești pe $post_type, $priority etc. corecte
// Apoi modifică output-ul
foreach( $wp_meta_boxes as $index => $box )
$wp_meta_boxes[ $index]['title'] = 'TITLU PERSONALIZAT';
return $wp_meta_boxes;
}
add_action( 'do_meta_boxes', 'alter_meta_box_titles', 0, 3);

Știu că aceasta este o întrebare veche, dar există un cârlig de filtrare pentru aceasta. Ai adăuga în functions.php
al temei tale sau într-un plugin de funcționalități personalizate o funcție legată de post_type_labels_{$post_type}
De exemplu, să presupunem că avem un tip de postare personalizată numită band
și vrem să schimbăm etichetele imaginii reprezentative în "Poză de Bandă". Funcția ar arăta cam așa:
function wpse39446_modify_featured_image_labels( $labels ) {
$labels->featured_image = __( 'Poză de Bandă', 'textdomain' );
$labels->set_featured_image = __( 'Setează Poză de Bandă', 'textdomain' );
$labels->remove_featured_image = __( 'Șterge Poză de Bandă', 'textdomain' );
$labels->use_featured_image = __( 'Folosește ca Poză de Bandă', 'textdomain' );
return $labels;
}
add_filter( 'post_type_labels_band', 'wpse39446_modify_featured_image_labels', 10, 1 );
referință: https://developer.wordpress.org/reference/hooks/post_type_labels_post_type/

Începând cu WordPress 4.4, argumentul $screen poate fi un array, ceea ce simplifică foarte mult adăugarea sau modificarea în masă a metabox-urilor.
Următorul cod schimbă titlul metabox-ului "Autor" în "Editor" pentru pagini, articole, atașamente și toate tipurile personalizate de postări, indiferent câte sunt adăugate sau când sunt adăugate pe site-ul tău.
add_action('do_meta_boxes', 'my_customize_meta_boxes'); //folosirea do_meta_boxes permite și modificarea metabox-urilor plugin-urilor
function my_customize_meta_boxes(){
$post_types = get_post_types();
remove_meta_box( 'authordiv', $post_types, 'normal' );
add_meta_box('authordiv', __('Editor'), 'post_author_meta_box', $post_types, 'side', 'default');
}

Aceasta este o soluție puțin improvizată, dar pentru cei care au nevoie de o soluție CSS simplă, folosiți următoarele:
.meta-box-sortables #your-metabox-id .ui-sortable-handle span {
color: transparent;
}
.meta-box-sortables #your-metabox-id .ui-sortable-handle span:before {
content: 'Noul tău titlu';
display: inline-block;
color: #000;
}
Doar înlocuiți your-metabox-id cu al vostru. :)
(notă: de obicei adaug un fișier admin.css prin functions.php, acolo unde controleaz unele stiluri din wp admin)

Bine... Acest truc este puțin hacky, dar am considerat că e destul de ingenios. Practic, folosești funcțiile încorporate pentru limbă pentru a schimba ce dorești. Atât timp cât știi cuvintele originale pe care vrei să le modifici și acestea au fost corect marcate în cod cu ceva de genul __('text aici')
, le poți schimba în orice dorești.
Am folosit odată această metodă pentru a schimba numele căsuței meta "Excerpts" (Fragmente) într-un alt nume (împreună cu descrierea din interior), deoarece tema mea o folosea pentru bucăți extrem de mici de text. Uite un exemplu:
/**
* Mai jos sunt câteva personalizări care modifică textul afișat prin filtrul gettext.
* Aceasta a fost inițial destinată traducerii temelor în alte limbi, dar de ce să nu
* o folosim pentru mai multă personalizare?
*
* @link http://codex.wordpress.org/Plugin_API/Filter_Reference/gettext
*
*/
add_filter( 'gettext', 'change_excerpt_name', 20, 3 );
function change_excerpt_name( $translated_text, $text, $domain ) {
if( $_GET['post_type'] == 'events' ) {
switch ( $translated_text ) {
case 'Excerpt' :
$translated_text = 'Rezumat Rapid';
break;
case 'Excerpts are optional hand-crafted summaries of your content that can be used in your theme. <a href="%s">Learn more about manual excerpts</a>.' :
$translated_text = 'Folosește acest câmp pentru a REZUMATA foarte mult descrierea acestui eveniment. Încearcă să te limitezi la aproximativ 12 cuvinte sau mai puțin dacă este posibil. Dacă săriți peste acest câmp, vor fi folosite primele câteva cuvinte din zona de mai sus.';
break;
}
}
return $translated_text;
}
Se pare că nu am fost singurul care s-a gândit la asta. Surpriză. Iată un articol care discută aceeași idee, dar cu o metodă diferită de utilizare a gettext.
