Это код, который я придумал благодаря некоторой помощи из ответа Wordpress StackOverflow, который я больше не могу найти (пожалуйста, прокомментируйте ссылку, если найдете ее).
Сначала вам нужно добавить фильтр в конкретное меню (вы можете добавить его во все меню, если хотите - просто используйте строку add_filter отдельно).
// Add filter to specific menus
add_filter('wp_nav_menu_args', 'add_filter_to_menus');
function add_filter_to_menus($args) {
// You can test agasint things like $args['menu'], $args['menu_id'] or $args['theme_location']
if( $args['theme_location'] == 'header_menu') {
add_filter( 'wp_setup_nav_menu_item', 'filter_menu_items' );
}
return $args;
}
Затем вам нужно создать код для получения идентификатора записи или категории из объекта $item, переданного фильтру. Это не так просто, как вы ожидаете, поскольку $item не содержит базовый идентификатор записи/категории, а только идентификатор пункта меню. Поэтому я использую URL-адреса для обратного поиска идентификаторов.
Это не работает для тегов, используемых в меню, или пользовательских таксономий. Мне это нужно было только для категорий, так что это все, что я создал.
// Filter menu
function filter_menu_items($item) {
if( $item->type == 'taxonomy') {
// For category menu items
$cat_base = get_option('category_base');
if( empty($cat_base) ) {
$cat_base = 'category';
}
// Get the path to the category (excluding the home and category base parts of the URL)
$cat_path = str_replace(home_url().'/'.$cat_base, '', $item->url);
// Get category and image ID
$cat = get_category_by_path($cat_path, true);
$thumb_id = get_term_meta($cat->term_id, '_term_image_id', true); // I'm using the 'Simple Term Meta' plugin to store an attachment ID as the featured image
} else {
// Get post and image ID
$post_id = url_to_postid( $item->url );
$thumb_id = get_post_thumbnail_id( $post_id );
}
if( !empty($thumb_id) ) {
// Make the title just be the featured image.
$item->title = wp_get_attachment_image( $thumb_id, 'poster');
}
return $item;
}
И затем вы хотите удалить фильтр, который вы применили в начале, чтобы следующее обрабатываемое меню не использовало тот же HTML, который определен выше в filter_menu_items().
// Remove filters
add_filter('wp_nav_menu_items','remove_filter_from_menus', 10, 2);
function remove_filter_from_menus( $nav, $args ) {
remove_filter( 'wp_setup_nav_menu_item', 'filter_menu_items' );
return $nav;
}
person
Drew Baker
schedule
27.09.2014