Cambio de etiquetas del menú de administración

44

Pasé el último día usando el archivo functions.php para personalizar completamente WordPress para los sitios de mis clientes. Estoy sorprendido de lo mucho que he podido lograr y de lo fácil que será para mis clientes.

He eliminado ciertos elementos de menú para usuarios que no han iniciado sesión como administrador. Lo que espero (y por lo que he leído, sé que se puede hacer) es encontrar una manera de cambiar el nombre de algunos de los elementos del menú (barra lateral izquierda en el área de administración). Por ejemplo, cambiar publicaciones a artículos.

Si alguien puede proporcionar el código para el archivo functions.php o señalarme en la dirección, ¡lo agradecería mucho!

Adán
fuente
¿Quizás debería dividir esto en dos preguntas diferentes: "Cambiar el nombre de los elementos del menú de administración" y "Cambiar el orden de los elementos del menú de administración" ? Esto lo ayudará a obtener más vistas para su pregunta.
Jan Fabry

Respuestas:

66

Aquí está el proceso para cambiar las etiquetas (en mi ejemplo cambié las publicaciones a "contactos")

function change_post_menu_label() {
    global $menu;
    global $submenu;
    $menu[5][0] = 'Contacts';
    $submenu['edit.php'][5][0] = 'Contacts';
    $submenu['edit.php'][10][0] = 'Add Contacts';
    $submenu['edit.php'][15][0] = 'Status'; // Change name for categories
    $submenu['edit.php'][16][0] = 'Labels'; // Change name for tags
    echo '';
}

function change_post_object_label() {
        global $wp_post_types;
        $labels = &$wp_post_types['post']->labels;
        $labels->name = 'Contacts';
        $labels->singular_name = 'Contact';
        $labels->add_new = 'Add Contact';
        $labels->add_new_item = 'Add Contact';
        $labels->edit_item = 'Edit Contacts';
        $labels->new_item = 'Contact';
        $labels->view_item = 'View Contact';
        $labels->search_items = 'Search Contacts';
        $labels->not_found = 'No Contacts found';
        $labels->not_found_in_trash = 'No Contacts found in Trash';
    }
    add_action( 'init', 'change_post_object_label' );
    add_action( 'admin_menu', 'change_post_menu_label' );

Para cambiar el orden del menú, vaya con esto:

// CUSTOMIZE ADMIN MENU ORDER
   function custom_menu_order($menu_ord) {
       if (!$menu_ord) return true;
       return array(
        'index.php', // this represents the dashboard link
        'edit.php', //the posts tab
        'upload.php', // the media manager
        'edit.php?post_type=page', //the posts tab
    );
   }
   add_filter('custom_menu_order', 'custom_menu_order');
   add_filter('menu_order', 'custom_menu_order');

Tengo código para eliminar elementos, pero es global y no se basa en el nivel de acceso del usuario

Norcross
fuente
Esto es excelente, gracias! Ahora solo necesito encontrar una manera de mover un elemento del submenú (ej. Menús) como botón del menú principal. ¿Alguna idea sobre eso?
Adam
No lo he probado, pero mira si agregar 'nav-menus.php' a la matriz lo mueve hacia arriba.
Norcross
Lamentablemente no. Esta ha sido la parte que me ha estado molestando. Solo quiero que los menús y widgets sean sus propios botones para que sea más fácil para los clientes. Gracias por intentarlo
Adam
@Norcross Esto es genial, pero ¿es posible adaptarlo para que pueda incluir el dominio de texto con fines de traducción?
Phill Healey
@PhillHealey esta función no contiene ningún dato para etiquetar, sino solo el pedido en sí.
Norcross
8

Para cambiar el nombre del tipo de publicación predeterminado (o cualquier otro para el caso) simplemente use filtro post_type_labels_{$post_type}. Por defecto postlo será post_type_labels_post. En el siguiente código está la lista completa de etiquetas ( WP 4.7.1). No tienes que cambiarlo todo.

add_filter( 'post_type_labels_post', 'news_rename_labels' );

/**
* Rename default post type to news
*
* @param object $labels
* @hooked post_type_labels_post
* @return object $labels
*/
function news_rename_labels( $labels )
{
    # Labels
    $labels->name = 'News';
    $labels->singular_name = 'News';
    $labels->add_new = 'Add News';
    $labels->add_new_item = 'Add News';
    $labels->edit_item = 'Edit News';
    $labels->new_item = 'New News';
    $labels->view_item = 'View News';
    $labels->view_items = 'View News';
    $labels->search_items = 'Search News';
    $labels->not_found = 'No news found.';
    $labels->not_found_in_trash = 'No news found in Trash.';
    $labels->parent_item_colon = 'Parent news'; // Not for "post"
    $labels->archives = 'News Archives';
    $labels->attributes = 'News Attributes';
    $labels->insert_into_item = 'Insert into news';
    $labels->uploaded_to_this_item = 'Uploaded to this news';
    $labels->featured_image = 'Featured Image';
    $labels->set_featured_image = 'Set featured image';
    $labels->remove_featured_image = 'Remove featured image';
    $labels->use_featured_image = 'Use as featured image';
    $labels->filter_items_list = 'Filter news list';
    $labels->items_list_navigation = 'News list navigation';
    $labels->items_list = 'News list';

    # Menu
    $labels->menu_name = 'News';
    $labels->all_items = 'All News';
    $labels->name_admin_bar = 'News';

    return $labels;
}

Si desea soporte de internacionalización, simplemente use __( $text, $textdomain )como:

$labels->name = __( 'News', 'textdomain' );

Encontré el filtro en función: get_post_type_labels()de un archivo wp-includes/post.php:

/**
 * Filter the labels of a specific post type.
 *
 * The dynamic portion of the hook name, `$post_type`, refers to
 * the post type slug.
 *
 * @since 3.5.0
 *
 * @see get_post_type_labels() for the full list of labels.
 *
 * @param object $labels Object with labels for the post type as member variables.
 */
$labels = apply_filters( "post_type_labels_{$post_type}", $labels );
Ivan
fuente
2
La respuesta de Norcross puede haber sido la mejor en el momento en que se escribió, pero este es un enfoque mucho más limpio que utiliza un filtro nativo para lograr el mismo resultado.
Ryan
2
Una vez escrito el original, acepto que este filtro es mucho mejor.
Norcross
3

Es posible que desee ver esta pregunta

y la clase que mencionan allí en esencia

que tiene funciones que estás buscando

rename_admin_menu_section()

cambiar el nombre, por ejemplo, cambiar publicaciones a artículos

y puede eliminar el menú de apariencias y crear su nuevo elemento de menú de la página superior para

Bainternet
fuente
3

Estoy de acuerdo ... El functions.phparchivo ofrece mucha flexibilidad. Necesitaba algunas de las mismas funciones que describiste con una combinación de functions.phpfiltros y este complemento .

Por lo que puedo decir ... este complemento lograría ambos problemas y también funciona bien en situaciones de instalación de sitios múltiples. Espero que ayude.

Ross
fuente
Ooops ... dispara, lo siento, acabo de ver un poco acerca de no querer usar un complemento. Definitivamente, hay formas de traducir los nombres de las pestañas y las ubicaciones solo con Functions.php. Para mí, después de seguir este camino (tratando de estar libre de complementos para esto) decidí que la codificación adicional simplemente no valía la pena ... dado lo fácil que era usar ese complemento. Lo siento, me perdí ese criterio antes.
Ross
No hay problema Ross, de todos modos lo investigaré. Gracias
Adam
0

El ejemplo anterior de Norcross es correcto, pero necesitaba la posibilidad de internacionalización. Si tuviera la reputación, este sería un comentario bajo la respuesta de Norcross, pero como no la tengo, pondré el código modificado aquí. 'i18n_context' es un espacio de nombres arbitrario para el contexto de traducción, este podría ser el nombre de su complemento o tema, por ejemplo.

function change_post_menu_label() {
  global $menu;
  global $submenu;
  $menu[5][0] = __('Contacts', 'i18n_context');
  $submenu['edit.php'][5][0] = __('Contacts', 'i18n_context');
  $submenu['edit.php'][10][0] = __('Add Contacts', 'i18n_context');
  $submenu['edit.php'][15][0] = __('Status', 'i18n_context'); // Change name for categories
  $submenu['edit.php'][16][0] = __('Labels', 'i18n_context'); // Change name for tags
  echo '';
}

function change_post_object_label() {
  global $wp_post_types;
  $labels = &$wp_post_types['post']->labels;
  $labels->name = __('Contacts', 'i18n_context');
  $labels->singular_name = __('Contact', 'i18n_context');
  $labels->add_new = __('Add Contact', 'i18n_context');
  $labels->add_new_item = __('Add Contact', 'i18n_context');
  $labels->edit_item = __('Edit Contacts', 'i18n_context');
  $labels->new_item = __('Contact', 'i18n_context');
  $labels->view_item = __('View Contact', 'i18n_context');
  $labels->search_items = __('Search Contacts', 'i18n_context');
  $labels->not_found = __('No Contacts found', 'i18n_context');
  $labels->not_found_in_trash = __('No Contacts found in Trash', 'i18n_context');
}
add_action( 'init', 'change_post_object_label' );
add_action( 'admin_menu', 'change_post_menu_label' );
nimmolo
fuente
¿Por qué no sugirió una edición a la otra respuesta?
fuxia
bueno, no puedo comentar aún ... también pensé que cortar y pegar podría ser útil en el caso de que Norcross quiera editarlo.
nimmolo