Tambahkan gambar unggulan ke item wp_nav_menu

Ini adalah tanya jawab mandiri.

Bagaimana Anda mengubah teks/html yang muncul di output wp_nav_menu? Misalnya, saya ingin menambahkan gambar unggulan untuk halaman dan kategori.

Anda melihat contoh melakukan hal ini dengan walker khusus, tetapi kodenya sangat rumit untuk dilakukan untuk perubahan kecil. Tentunya ada cara untuk melakukannya dengan filter?


person Drew Baker    schedule 27.09.2014    source sumber


Jawaban (1)


Ini adalah kode yang saya buat berkat bantuan dari jawaban Wordpress StackOverflow yang tidak dapat saya temukan lagi (silakan beri komentar dengan tautan jika Anda menemukannya).

Pertama, Anda perlu menambahkan filter ke menu tertentu (Anda bisa menambahkannya ke semua menu jika Anda mau - cukup gunakan baris add_filter saja).

// 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;
}

Kemudian Anda perlu membuat kode untuk mendapatkan ID postingan atau kategori dari objek $item yang diteruskan ke filter. Ini tidak semudah yang Anda harapkan, karena $item tidak berisi ID postingan/kategori yang mendasarinya, hanya ID item menu. Jadi saya menggunakan URL untuk melakukan pencarian balik ID.

Ini tidak akan berfungsi untuk tag yang digunakan dalam menu, atau taksonomi khusus. Saya hanya membutuhkannya untuk kategori, jadi hanya ini yang saya buat.

// 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;
}

Dan kemudian Anda ingin menghapus filter yang Anda terapkan di awal, sehingga menu yang diproses selanjutnya tidak menggunakan HTML yang sama seperti yang didefinisikan di atas pada 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