Cambiar el título de un Meta Box

19 ene 2012, 18:12:36
Vistas: 16.2K
Votos: 10

Estoy intentando crear una función que me permita cambiar el título de un meta box establecido (por ejemplo, cambiar el título 'Autores' a 'Equipo', etc.).

No quería usar JavaScript ni tener que eliminar el meta box original y volver a agregarlo.

Empecé con lo siguiente, según otro hilo que mostraba el código de esta manera:

// enganchar a la acción '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 de meta boxes definidos
    // recorrer el array, cambiar los títulos que desees
}

Estoy atascado en la parte de "recorrer el array y cambiar los títulos que desees".

¿Cuál sería la mejor manera de lograrlo? ¿Usar un foreach para hacer un bucle? ¿O un escenario Switch/Case? Soy bastante nuevo en esto, ¿alguien podría proporcionar un ejemplo de cómo hacerlo?

Actualización: El ejemplo de Stephen Harris funciona para Meta Boxes del núcleo (¡gracias!):

add_action('add_meta_boxes', 'change_meta_box_titles');
function change_meta_box_titles() {
    global $wp_meta_boxes; // array de meta boxes definidos
    // recorrer el array, cambiar los títulos que desees

    $wp_meta_boxes['post']['normal']['core']['authordiv']['title']= 'Miembro del equipo';
}

Actualización: Solución para Meta Boxes personalizados

Para que esto funcione con tus meta boxes personalizados, cambia tu add_action de la siguiente manera para que ejecute tu código de cambio de título después de que se haya agregado el meta box:

add_action('add_meta_boxes', 'change_meta_box_titles', 999);
0
Todas las respuestas a la pregunta 6
7
13

Respuesta Mejorada

He decidido revisitar esta pregunta después de darme cuenta de lo innecesariamente complicada que era.

La mejor solución es eliminar el metabox y luego volver a agregarlo, especificando un título alternativo. Aquí hay un ejemplo para el tipo de publicación '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', __('Miembro del Equipo','wpse39446_domain'), 'post_author_meta_box', 'post', 'core', 'high' );
}

Nota: Si estás haciendo esto para un metabox que no es del núcleo, necesitarás asegurarte de que el callback se llame después de que se agregue el metabox especificando una prioridad más alta.


Entonces, $wp_meta_boxes tiene muchas matrices anidadas

Para tus propósitos:

$wp_meta_boxes['post_type']['normal']['core']['authordiv']['title']= 'equipos';

(NB. No estoy seguro si se pasan argumentos a esa acción...:

add_action('add_meta_boxes', 'change_meta_box_titles');
function change_meta_box_titles() {
    global $wp_meta_boxes; // array de metaboxes definidos
    // recorrer el array, cambiar los títulos que quieras
}

En realidad, la estructura del array es más complicada. He actualizado mi código. Lo he probado y funciona :D (Solo asegúrate de cambiar 'post_type' por el tipo de publicación, por ejemplo 'post').

Básicamente, la estructura del array es tipo-de-publicación > prioridad > core > ID del metabox.

Si quieres ver el array por ti mismo, dentro de tu función usa:

echo '<pre>';
print_r($wp_meta_boxes);
echo '</pre>';
wp_die('');
19 ene 2012 18:34:31
Comentarios

Stephen Harris, ¡podría besarte! Eso funcionó a la perfección, ¡muchas gracias!

Parece que estaba complicando demasiado mi código cuando intentaba resolver esto por mi cuenta.

Syrehn Syrehn
19 ene 2012 19:15:00

Me alegra haber ayudado :D

Stephen Harris Stephen Harris
19 ene 2012 19:16:24

Hmm... probé esto con un metabox personalizado que creé, "projectinfo" era el ID único del metabox, así que luego intenté...

$wp_meta_boxes['post']['side']['core']['projectinfo']['title']= 'New Title'; pero eso no funcionó, ¿me perdí de algo aquí?

Syrehn Syrehn
19 ene 2012 19:45:57

Prueba echo '<pre>'; print_r($wp_meta_boxes); echo '</pre>'; wp_die(''); después de cambiar el título para ver qué salió mal. Mi suposición es que no es 'core' :D

Stephen Harris Stephen Harris
19 ene 2012 19:55:46

Agregué eso, los meta personalizados no aparecen en la lista. Así que probablemente tengas razón, no es un 'core'.

Syrehn Syrehn
19 ene 2012 19:59:18

Gracias por esta maravillosa respuesta y pregunta. ¡Estaba buscando exactamente lo mismo! Gracias de nuevo. :)

Nicole Nicole
19 sept 2012 01:59:35

Consulta mi respuesta más abajo en esta página para ver cómo hacerlo con múltiples tipos de entradas a la vez (WordPress 4.4 y versiones posteriores).

Slam Slam
11 oct 2017 18:38:27
Mostrar los 2 comentarios restantes
0

Por lo que sé, tu mejor opción sería enganchar una función al hook justo antes de la creación de los meta boxes:

function alterar_titulos_meta_boxes( $post_type, $priority, $post )
{
    global $wp_meta_boxes;

    // Verifica si estás en el $post_type, $priority, etc. correctos
    // Luego modifica el resultado
    foreach( $wp_meta_boxes as $index => $box )
        $wp_meta_boxes[ $index]['title'] = 'TÍTULO PERSONALIZADO';

    return $wp_meta_boxes;
}
add_action( 'do_meta_boxes', 'alterar_titulos_meta_boxes', 0, 3);
19 ene 2012 18:38:21
0

Sé que es una pregunta antigua, pero existe un filtro para esto. Deberías agregar a tu archivo functions.php del tema o a un plugin de funcionalidad personalizada una función enganchada a post_type_labels_{$post_type}.

Por ejemplo, si tenemos un tipo de entrada personalizado llamado band y queremos cambiar las etiquetas de la imagen destacada a "Foto de la Banda". La función se vería así:

function wpse39446_modify_featured_image_labels( $labels ) {
  $labels->featured_image = __( 'Foto de la Banda', 'textdomain' );
  $labels->set_featured_image = __( 'Establecer Foto de la Banda', 'textdomain' );
  $labels->remove_featured_image = __( 'Eliminar Foto de la Banda', 'textdomain' );
  $labels->use_featured_image = __( 'Usar como Foto de la Banda', 'textdomain' );

  return $labels;
}
add_filter( 'post_type_labels_band', 'wpse39446_modify_featured_image_labels', 10, 1 );

ref: https://developer.wordpress.org/reference/hooks/post_type_labels_post_type/

25 may 2017 23:41:13
1

Desde WordPress 4.4, el argumento $screen puede ser un array, lo que simplifica enormemente las adiciones o modificaciones masivas de meta boxes.

El siguiente código cambia el título de la meta box "Autor" a "Editor" en páginas, entradas, archivos adjuntos y todos los tipos de contenido personalizados, sin importar cuántos se añadan o cuándo se añadan a tu sitio.

add_action('do_meta_boxes', 'my_customize_meta_boxes'); //usar do_meta_boxes también permite modificar meta boxes de plugins
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');
}
6 ago 2017 18:17:46
Comentarios

¡Funcionó perfectamente, gracias! Reemplacé $post_types con un array de los tipos de post que realmente quería afectar, ya que get_post_types() devuelve todos los tipos de post conocidos.

alexg alexg
20 may 2021 19:37:07
0

Esto es un poco improvisado, pero para cualquiera que necesite una solución CSS simple, usa esto:

.meta-box-sortables #your-metabox-id .ui-sortable-handle span {
    color: transparent;
}

.meta-box-sortables #your-metabox-id .ui-sortable-handle span:before {
    content: 'Tu nuevo título';
    display: inline-block;
    color: #000;
}

Solo reemplaza "your-metabox-id" con el tuyo. :)

(nota: normalmente agrego un admin.css a través de functions.php, ahí es donde controlo algunos estilos del admin de WordPress)

9 dic 2017 21:40:49
0

Está bien... Esto es un poco truculento, pero pensé que era algo ingenioso. Básicamente, usas las funciones de idioma incorporadas para cambiar lo que quieras. Siempre y cuando conozcas la palabra o palabras originales que deseas cambiar y hayan sido llamadas correctamente en el código con algo como __('texto aquí'), puedes cambiarlas por lo que prefieras.

Una vez lo usé para cambiar el nombre de la caja meta "Extractos" por otro (junto con la descripción interna) porque mi tema lo utilizaba para fragmentos de texto extremadamente pequeños. Echa un vistazo:

/**
 * Aquí hay algunas personalizaciones que cambian la salida de texto mediante el filtro gettext.
 * Esto estaba pensado para traducir temas a otros idiomas, pero ¿por qué no
 * usarlo para más personalizaciones?
 *
 * @link http://codex.wordpress.org/Plugin_API/Filter_Reference/gettext
 *
 */
add_filter( 'gettext', 'cambiar_nombre_extracto', 20, 3 );
function cambiar_nombre_extracto( $texto_traducido, $texto, $dominio ) {

    if( $_GET['post_type'] == 'eventos' ) {

        switch ( $texto_traducido ) {

            case 'Extracto' :

                $texto_traducido = 'Resumen rápido';
                break;

            case 'Los extractos son resúmenes opcionales hechos a mano de tu contenido que pueden usarse en tu tema. <a href="%s">Aprende más sobre extractos manuales</a>.' :

                $texto_traducido = 'Usa este campo para REALMENTE condensar la descripción de este evento. Intenta mantenerlo alrededor de 12 palabras o menos si es posible. Si omites este campo, se usarán las primeras palabras del área superior.';
                break;

        }

    }

    return $texto_traducido;
}

Resulta que no fui el único en pensar esto. Sorpresa. Aquí hay un artículo que discute la misma idea, con un método diferente de usar gettext.

10 may 2012 09:11:31