Как добавить пользовательское имя HTML-класса в элементы подменю экрана администратора?


Вот эти пункты подменю в меню Сообщения

enter image description here

Я проверил код и обнаружил, что его разметка такова

<ul class="wp-submenu wp-submenu-wrap">
  <li class="wp-submenu-head" aria-hidden="true">Posts</li>
  <li class="wp-first-item current"><a href="edit.php" class="wp-first-item current">All Posts</a></li>
  <li><a href="post-new.php">Add New</a></li>
  <li><a href="edit-tags.php?taxonomy=category">Categories</a></li>
  <li><a href="edit-tags.php?taxonomy=post_tag">Tags</a></li>
</ul>

Что я хотел бы сделать, так это добавить пользовательский класс my-custom-class в теги <li> (обработанные на стороне сервера), чтобы он стал таким

<ul class="wp-submenu wp-submenu-wrap">
  <li class="wp-submenu-head" aria-hidden="true">Posts</li>
  <li class="wp-first-item current my-custom-class"><a href="edit.php" class="wp-first-item current">All Posts</a></li>
  <li class="my-custom-class"><a href="post-new.php">Add New</a></li>
  <li class="my-custom-class"><a href="edit-tags.php?taxonomy=category">Categories</a></li>
  <li class="my-custom-class"><a href="edit-tags.php?taxonomy=post_tag">Tags</a></li>
</ul>

Есть ли способ добавить пользовательское имя класса HTML в admin элементы подменю экрана?

Author: Abel Callejo, 2017-04-17

5 answers

Вы можете сделать str_replace в html, что произойдет до загрузки страницы:

Просто нужно разработать селекторы или затем проанализировать их с помощью DOMDocument

function callback($buffer) {

    $buffer = str_replace('wp-first-item', 'wp-first-item my-custom-class', $buffer);

    return $buffer;
}

function buffer_start() { ob_start("callback"); }

function buffer_end() { ob_end_flush(); }

add_action('admin_head', 'buffer_start');
add_action('admin_footer', 'buffer_end');
 2
Author: Jack Nicholson, 2017-05-23 12:02:19

Это должно сделать это:

function add_admin_class() {
    $find = '.wp-submenu li';
    $add_class = 'my-custom-class';

    echo '"<script type="text/javascript">
        jQuery(function() {
            jQuery("' . $find . '").addClass("' . $add_class . '");
        });
    </script>"';
}
add_action('admin_footer', 'add_admin_class');

enter image description here

 1
Author: Jack Nicholson, 2017-04-22 14:52:45

Я исследовал это. Вы не можете добавлять css-классы в пункты меню администратора, если не взломаете основные файлы.

Чтобы добавить новый пункт подменю, вы можете использовать delete_submenu_page(), а затем add_submenu_page(), но это не позволяет указать класс css для него.

 1
Author: Adam Rehal, 2017-04-22 23:29:30

На самом деле мы можем сделать это с помощью простого плагина, подобного этому:

<?php
/** Plugin Name: Custom Admin Submenu CSS Class **/

add_action( 'admin_menu', function() use ( &$submenu )
{
    $class = 'my-class'; // Edit to your needs!

    if( ! isset( $submenu['edit.php'][5] ) )
        return;

    if( ! empty( $submenu['edit.php'][5][4] ) ) // Append if css class exists
        $submenu['edit.php'][5][4] .= ' ' . $class;
    else                                      
        $submenu['edit.php'][5][4] = $class;

} );

Мы построили его таким образом, выделив эту эту часть основной функции _wp_menu_output():

if ( ! empty( $sub_item[4] ) ) {
    $class[] = esc_attr( $sub_item[4] );
}

Вот как выглядит измененный HTML:

<ul class='wp-submenu wp-submenu-wrap'>
    <li class='wp-submenu-head' aria-hidden='true'>Posts</li>
    <li class="wp-first-item current my-class">
        <a href='edit.php' class="wp-first-item current my-class">All Posts</a>
    </li>
    <li>
        <a href='post-new.php'>Add New</a>
    </li>
    <li>
        <a href='edit-tags.php?taxonomy=category'>Categories</a>
    </li>
    <li>
        <a href='edit-tags.php?taxonomy=post_tag'>Tags</a>
    </li>
</ul>

Где пользовательский класс css добавляется как к тегу <li>, так и к тегу <a>.

В общем, мне не нравится изменять глобальную переменную, но, похоже, нет обходного пути для добавления класса в подменю через add_submenu_page() или другие явные фильтры.

Если вы хотите изменить классы css для элементов первого уровня (меню), вы можете, например, заглянуть в add_menu_classes фильтр.

Если вы твердо убеждены в том, что классы css для подменю должны напрямую настраиваться с помощью фильтра, то вы можете создать билет trac, подробно объяснить, почему это необходимо, и, например, предложить новый фильтр add_submenu_classes.

Надеюсь, это поможет!

 1
Author: birgire, 2017-04-23 09:26:23

Пожалуйста, попробуйте это:

Это сработало для меня.

add_action('admin_init','add_custom_class_adminMenu');
function add_custom_class_adminMenu() 
{
    global $menu;
    foreach($menu as $key => $value)
    {
        if('Posts' == $value[0])
        {
            $menu[$key][4] .= " custom-class-1";
        }

        if('Pages' == $value[0])
        {
            $menu[$key][4] .= " custom-class-2";
        }            
    }
}
 1
Author: BlueSuiter, 2017-04-25 08:57:57