Tôi đang tự trả lời vì hôm nay tôi đã tự hỏi mình 2 câu hỏi tôi đã đăng và dành một chút thời gian để tìm câu trả lời. Khi tôi tìm thấy giải pháp, tôi muốn chia sẻ nó, nhưng bất kỳ giải pháp nào khác đều được đánh giá cao và tôi sẵn sàng chấp nhận bất kỳ giải pháp nào tôi thấy tốt hơn giải pháp của mình. Chỉnh sửa và cải thiện giải pháp của tôi cũng được đánh giá cao cũng được khuyến khích.
Biên tập
Sau khi trả lời Rarst tôi đã chỉnh sửa mã. Bây giờ hàm sử dụng các lớp dashicons tiêu chuẩn, nhưng cũng cho phép chỉ định một url hình ảnh kiểu cũ trong menu_icon
đối số và một lớp dashicons hoàn toàn mới trong menu_dashicon
đối số.
Quy trình làm việc
Đầu tiên tôi nghĩ rằng tôi nghĩ rằng register_post_type
, thực hiện một hành động, registered_post_type
chuyển đến các hàm hook mà các đối số được truyền tới register_post_type
, mà không lọc chúng, do đó có thể tạo các đối số tùy chỉnh cho các hàm đó.
Vì vậy, tôi quyết định chuyển đối số 'menu_dashicon'
để vượt qua một dashicon tùy chỉnh.
Sau đó tôi nghĩ sẽ tạo ra một lớp lắng nghe đối số đó, lưu biểu tượng trong một biến lớp. Cùng một lớp có thể chịu trách nhiệm
- kiểm tra phiên bản hiện tại của WP và nếu ít hơn thì 3,8 không làm gì cả
- nếu phiên bản là 3,8+ lặp thì
$menu
mảng trên hook thích hợp và:
- xóa, nếu có, bất kỳ hình ảnh tùy chỉnh được thêm thông qua
'menu_icon'
và
- thêm kiểu nội tuyến theo những gì được thêm thông qua
'menu_dashicon'
param
Tôi tạo mã trong một tệp duy nhất, theo cách này có thể dễ dàng đưa vào bất kỳ chủ đề / plugin nào hoặc thậm chí được sử dụng làm plugin MU và sau đó người ta có thể sử dụng 'menu_dashicon'
đối số hoàn toàn mới trong mọi chủ đề và / hoặc plugin được cài đặt.
Tôi cũng đã thêm một tiêu đề plugin tối thiểu cho phép sử dụng nó như một plugin độc lập, nhưng có lẽ đó là cách sử dụng ít hữu ích hơn.
Cách sử dụng
Bên trong register_post_type
chỉ cần truyền 'menu_dashicon'
đối số với giá trị của lớp dashicon ( không có tiền tố 'dashicons-'):
$args = array(
...
'menu_dashicon' => 'chart-pie', // dashicons will be used in WP 3.8+
'menu_icon' => $url_of_the_icon // icon images will be used in WP 3.7.1 & previous
);
register_post_type('my_cpt', $args);
Đó là tất cả. Nhận tên lớp biểu tượng Dashicons từ trang web của nó .
Vì vậy, đây là mã:
<?php
/**
* Plugin Name: GM CPT Icon
*/
namespace GM;
class CptIcon {
public static $cpt;
public $css;
static function registerIcon( $cpt, $icon ) {
self::$cpt[$cpt] = $icon;
}
function init() {
if ( $this->mp6() ) {
\add_action('admin_menu', array($this, 'parseMenu') );
}
}
function mp6() {
return \version_compare( $GLOBALS['wp_version'], '3.8', '>=' );
}
function parseMenu() {
if ( $this->mp6() && ! empty( self::$cpt ) ) {
foreach ( $GLOBALS['menu'] as $i => $item ) {
if $item[1] === 'edit_posts' && (strpos($item[2], 'edit.php?post_type=') === 0)) {
$this->menuItemClass($i, str_replace('edit.php?post_type=', '', $item[2]));
}
}
}
}
function menuItemClass( $i, $type ) {
if ( \in_array($type, \array_keys(self::$cpt), TRUE ) ) {
$GLOBALS['menu'][$i][4] = str_replace('menu-icon-post', '', $GLOBALS['menu'][$i][4]);
$GLOBALS['menu'][$i][6] = 'dashicons-' . self::$cpt[$type];
}
}
}
\add_action('plugins_loaded', function() {
if ( \is_admin() && !( \defined('DOING_AJAX') && \DOING_AJAX ) ) {
$cpticon = new CptIcon;
$cpticon->init();
}
});
\add_action('registered_post_type', function( $post_type, $args ) {
if ( isset($args->menu_dashicon) && ! empty($args->menu_dashicon) ) {
CptIcon::registerIcon($post_type, $args->menu_dashicon);
}
}, 10, 2);
Nó cũng có sẵn như là Gist
Hai CPT: "Ý tưởng" và "Thư viện" bằng cách sử dụng Dashicons. Lưu ý thay đổi màu tự động với các bảng màu quản trị khác nhau.
menu_icon
bạn không thể sử dụng url hình ảnh cho các phiên bản trước ... nhưng ai quan tâm đến quá khứ? :)