ডাব্লুপি_নাভ_মেনু থেকে মেনু আইটেমগুলিকে গতিশীলভাবে বাদ দিন


17

আমি কাস্টম মেনুগুলি থেকে নাভি মেনু আইটেমগুলি কীভাবে বাদ / সরিয়ে ফেলতে পারি সে সম্পর্কিত তথ্যের সন্ধান করার চেষ্টা করেছি এবং আমি যে একমাত্র থ্রেড পেয়েছি তার কোনও উত্তর আমার কাছে কার্যকর ছিল না।

1। পটভূমি:

আমি আমার সাইটে ডাব্লুপি কাস্টম মেনু (wp_nav_menu) এবং jqDock ব্যবহার করে একসাথে একটি ডক মেনু রেখেছি। যেহেতু jqDock এর জাদুটি কাজ করতে অবিচ্ছিন্ন চিত্র বা চিত্রের লিঙ্কগুলির প্রয়োজন, তাই আমি কাস্টম ওয়াকার ব্যবহার করছি যাতে এনএভি মেনু এইচটিএমএল এইচটিএমএল আউটপুটটি এরকম দেখায়:

<div id="menu-first" class="nav">
<a><img src="http://path/to/image-1.png"/></a>
<a><img src="http://path/to/image-2.png"/></a>
<a><img src="http://path/to/image-3.png"/></a>
etc...
</div>

আমার কাস্টম ওয়াকারের কোডটি হ'ল:

class custom_nav_walker extends Walker_Nav_Menu 
{
    var $tree_type = array( 'post_type', 'taxonomy', 'custom' );
    var $db_fields = array( 'parent' => 'menu_item_parent', 'id' => 'db_id' );

    function start_lvl(&$output, $depth) {
        $indent = str_repeat("\t", $depth);
        $output .= "\n$indent<ul class=\"sub-menu\">\n";
    }

    function end_lvl(&$output, $depth) {
        $indent = str_repeat("\t", $depth);
        $output .= "$indent</ul>\n";
    }

    function start_el(&$output, $item, $depth, $args) {
        global $wp_query;
        $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

        $class_names = $value = '';

        $classes = empty( $item->classes ) ? array() : (array) $item->classes;
        $classes[] = 'menu-item-' . $item->ID;

        $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );
        $class_names = ' class="' . esc_attr( $class_names ) . '"';

        $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args );
        $id = strlen( $id ) ? ' id="' . esc_attr( $id ) . '"' : '';

        //$output .= $indent . '<li' . $id . $value . $class_names .'>';

        $attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) .'"' : '';
        $attributes .= ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) .'"' : '';
        $attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) .'"' : '';
        $attributes .= ! empty( $item->url )        ? ' href="'   . esc_attr( $item->url        ) .'"' : '';

        $description  = ! empty( $item->description ) ? esc_attr( strtolower( $item->description )) : '';
        $item_title   = ! empty( $item->attr_title )  ? esc_attr( $item->attr_title ) : '';

        if ( strpos($description, ';') !== false ) {
        $description_array = explode (';', $description);
            $image_name = $description_array[0];
            $image_alt = $description_array[1];
        } else {
            $image_name = $description;
            $image_alt = $item_title;
        }

        $item_output = $args->before;
        $item_output .= '<a'. $attributes .'>';
        $item_output .= $args->link_before .'<img src="'.get_bloginfo('template_url').'/images/skin1/'.$image_name.'" alt="'.$image_alt.'" title="'.$item_title.'" />'.$args->link_after;
        $item_output .= '</a>';
        $item_output .= $args->after;

        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
    }

    function end_el(&$output, $item, $depth) {
        $output .= "";
    }

}

এরপরে jqDock স্ক্রিপ্টটি মেনু আইডি ('মেনু-প্রথম') ক্যাচ করে এবং ডক মেনুতে wp_nav_menu আউটপুট প্রতিস্থাপন করে। ডক মেনুটির এইচটিএমএল আউটপুট পরিবর্তিত হয় যখন jqDock লোড করার সময় নির্দিষ্ট করা বিকল্পগুলির উপর ভিত্তি করে।

2. প্রশ্ন:

ব্যবহারকারী যেখানে সাইটে আছেন সে অনুযায়ী আমি নির্দিষ্ট মেনু আইটেমগুলি প্রদর্শন করতে (অর্থাত্ বাদ দিতে) চাই না। উদাহরণস্বরূপ, আমি কেবল তখনই হোম আইটেমটি প্রদর্শন করতে চাই যখন ব্যবহারকারী বাড়ীতে নেই এবং র্যান্ডম পোস্ট আইটেমটি কেবল তখনই থাকে।

৩. বাতিল করা সমাধান:

ক। মলিপল মেনু: নিবন্ধকরণ এবং একাধিক মেনু তৈরি করা এবং তারপর শর্তাধীন তাদের কল করা কাজ করতে পারে; তবে, আমি মনে করি না যে এটি অনেক কারণেই একেবারেই আদর্শ বা পরিষ্কার সমাধান নয়। এছাড়াও, একাধিক মেনু বজায় রাখা বা আপডেট করা সহজ নয়।

খ। রেজেক্স অনুসন্ধান এবং প্রতিস্থাপন: এইচএমএল আউটপুট পরিবর্তিত হওয়ার কারণে এটি প্রতিবারই আমি jqDock অপশনগুলি পরিবর্তন করার সময় সুই প্যারামিটারটি পরিবর্তন করতে বাধ্য করতে পারে ।

গ। সিএসএসের 'ডিসপ্লে' সম্পত্তি: সিএসএস প্রদর্শন বৈশিষ্ট্যের মাধ্যমে আইটেমগুলি আড়াল করা কাজ করে তবে যেহেতু এটি jqDock মেনু আউটপুটে প্রয়োগ করতে হবে, এটি মেনুটির ভিজ্যুয়াল রেন্ডারিংকে প্রভাবিত করে।

4. ব্যর্থ সমাধান:

ক। Wp_nav_menu_items এ ফিল্টার করুন : আমি '$ আইটেমগুলি' ভেরিয়েবল (স্ট্রিং) ধরার চেষ্টা করেছি এবং নিম্নলিখিত কোডের সাথে শর্তাধীন ট্যাগের মাধ্যমে এটিকে বিভিন্ন মান নির্ধারণ করার চেষ্টা করেছি:

function userf_dynamic_nav_menu ($items) {
    $items_array_home = explode('<a', $items);
    $items_array_nothome = $items_array_home;

    unset($items_array_home[1]);
    unset($items_array_nothome[2]);

    $items_home = implode('<a', $items_array_home);
    $items_nothome = implode('<a', $items_array_nothome);

    if ( is_home() ) {
        $items = $items_home;
    } else {
        $items = $items_nothome;
    }
    return $items;
}
add_filter('wp_nav_menu_first_items', 'userf_dynamic_nav_menu');

এটি কেবলমাত্র আংশিকভাবে কাজ করে, কারণ মেনু আইটেমগুলি পরিবর্তিত হয় তবে শর্তাধীন ট্যাগগুলি উপেক্ষা করা হয়। আমার ধারণা এই মুহুর্তে ফিল্টারটি প্রয়োগ করা হয়েছে কারণ এটি উপলব্ধি করে।

খ। কাস্টম এনএভি মেনু ফাংশন : আমি a ডিফল্ট অ্যারেটিতে একটি বাদ দেওয়া যুক্তি যুক্ত করতে এবং wp_list_pagesঅতিরিক্ত যুক্তি তৈরি করতে এই সামান্য পরিবর্তিত কোডটি ব্যবহার করতে সক্ষম হওয়ার জন্য আমার নিজস্ব কাস্টম এনএভি মেনু ফাংশন তৈরি করার চেষ্টা করেছি :

$exclude_array = ( $args->exclude ) ? explode(',', $args->exclude) : array();
$args->exclude = implode( ',', apply_filters('wp_nav_menu_excludes', $exclude_array) );

কোন ধারনা?


আপনি কি আমাদের আপনার কাস্টম ওয়াকার শিশু ক্লাসটি প্রদর্শন করতে পারেন?
সোলসেকাহ

হাই সৌলেসেকাহ, আমি কেবল এটি আমার মূল পোস্টে যুক্ত করেছি। ধন্যবাদ!
মার্ভেন্টাস

আমি excludeখুব যুক্তি পাস করার কথা ভেবেছিলাম , তবে এর বিপরীতে wp_list_pagesএবং অন্যান্য ডাব্লুপি কার্যক্রমে wp_nav_menuএকটিও অন্তর্ভুক্ত নয়। সুতরাং আমি মেনু বা ওয়াকারে কল করার সময় যদি আমি একটি নির্দিষ্ট করে নাও wp_nav_menu, তবে এটি ভিতরে বাছাই করা হবে না , তাই না?
মার্ভেন্টাস

দুঃখিত, আমি যখন এটি লিখেছিলাম তখন সরাসরি ভাবছিলাম না, সঙ্গে সঙ্গে মুছে ফেলা হয়েছিল।
সোলসেকাহ

এটা নিয়ে চিন্তা করবেন না!
মার্ভেন্টাস

উত্তর:


26

পদ্ধতি 1

কিছু অতিরিক্ত বর্জন যুক্তি সংরক্ষণ করার জন্য আপনি আপনার কাস্টম ওয়াকারে কোনও কনস্ট্রাক্টর যুক্ত করতে পারেন, যেমন:

class custom_nav_walker extends Walker_Nav_Menu {
    function __construct( $exclude = null ) {
        $this->exclude = $exclude;
    }

    function skip( $item ) {
        return in_array($item->ID, (array)$this->exclude);
        // or
        return in_array($item->title, (array)$this->exclude);
        // etc.
    }

    // ...inside start_el, end_el
    if ( $this->skip( $item ) ) return;
}

বা কনস্ট্রাক্টরটি ফেলে দিন এবং তার $excludeসম্পত্তিটি wp_nav_menu()পছন্দ হিসাবে এটি ওয়াকার হিসাবে পাস করার আগে সেট করুন :

$my_custom_nav_walker = new custom_nav_walker;
$my_custom_nav_walker->exclude = array( ... );

আপনি কী বাদ দিচ্ছেন তার উপর নির্ভর করে বাদ দিতে সঠিক ফর্মটি সরবরাহ করুন।

পদ্ধতি 2

এইভাবে আপনি wp_get_nav_menu_itemsফিল্টারটি হুক করে এটি করতে যাবেন ।

function wpse31748_exclude_menu_items( $items, $menu, $args ) {
    // Iterate over the items to search and destroy
    foreach ( $items as $key => $item ) {
        if ( $item->object_id == 168 ) unset( $items[$key] );
    }

    return $items;
}

add_filter( 'wp_get_nav_menu_items', 'wpse31748_exclude_menu_items', null, 3 );

দ্রষ্টব্য: object_idমেনুটি আইডিকে নির্দেশকৃত বস্তুটি IDহ'ল মেনু আইডি থাকাকালীন এগুলি পৃথক।

আমাকে তোমার ভাবনা বুঝতে দাও.


ধন্যবাদ! এটা কাজ করতে পারে। আমি এটি দিয়ে চেষ্টা করব এবং আপনাকে জানাবো।
মার্ভেন্টাস

আমি কন্ডাক্টর পদ্ধতির চেষ্টা করেছিলাম এবং আমি যত চেষ্টা করি না কেন, আমি in_arrayফাংশনটির জন্য একটি "দ্বিতীয় যুক্তির জন্য ভুল ডেটাটাইপ" পেতে থাকি । আমি কি ভুল কিছু করছি?
মার্ভেন্টাস

$excludeসম্পত্তি একটি অ্যারের হতে হবে। সুতরাং আপনি কনস্ট্রাক্টরে একটি অ্যারে পাস করছেন তা নিশ্চিত করুন, বা আমার উত্তরে আপডেট কোডটি দেখুন। বিশেষত টাইপাস্টের জন্য $this->exclude, কেবলমাত্র অ্যারে পাস না হলে।
সোলসেকাহ

সে সম্পর্কে দুঃখিত: আমার ফাংশনে আমার একটি টাইপ ছিল। আমি কেবল চেষ্টা করেছি $exclude = array ('4', '7');এবং স্লাগগুলিও ব্যবহার করেছি, তবে ওয়াকার আউটপুটটিতে এর কোনও প্রভাব পড়ছে না। আমি দ্বিতীয় পদ্ধতির চেষ্টা করব এবং আপনাকে জানাব।
মার্ভেন্টাস

নাহ, এটিও কাজ করে না। আমি মনে করি আমি এটি নির্ধারণের চেষ্টা থেকে মস্তিষ্কের মরে গেছি, যাতে এটি আমার ... "পারফরম্যান্স", :-)
-কে

0

এটা কি সাহায্য করে

$exclude_array = ( $args->exclude ) ? explode(',', $args->exclude) : array();
$args->exclude = implode( ',', apply_filters('wp_nav_menu_excludes', $exclude_array) );

উদাহরণ হিসাবে

< ?php wp_nav_menu( array( 'container_class' => 'menu-header', 'theme_location' => 'primary', 'exclude' => '66' ) ); ?>

হাই সাক, আমি উল্লেখ করতে ভুলে গেছি যে সমাধানগুলির কোনও কাজ হয়নি যা হ'ল একটি কাস্টম নাভি_মেনু ফাংশন তৈরি করা এবং সেই কোডটি ফাংশনের ডিফল্টগুলিতে অতিরিক্ত যুক্তি হিসাবে যুক্ত করা। দুঃখের বিষয়, এটি কার্যকর হয়নি। আমি এটিকে ওয়াকারে অন্তর্ভুক্ত করার চেষ্টা করিনি, তবে আমি মনে করি না যে এটি উপরোক্ত উল্লিখিত একই কারণে কার্যকর হবে, মূলত যে wp_nav_menu"বর্জন" তর্ক নেই, তবে আমি ভুল হতে পারি।
মার্ভেন্টাস

স্বচ্ছতার জন্য এটি অন্তর্ভুক্ত করতে আমি আমার মূল পোস্টটি আপডেট করেছি।
মার্ভেন্টাস

আপনি যদি কাস্টম ওয়াকার ব্যবহার না করেন, তবে পরিবর্তে আপনি নিয়মিত নাভ_মেনু ব্যবহার করেন এবং আপনার কাস্টম চিত্র সহ wp_get_nav_menu_items () দিয়ে আইটেমগুলি বের করেন
saq

এটি সাধারণভাবে একটি ভাল কাজ হতে পারে, তবে এই বিশেষ ক্ষেত্রে, wp_get_nav_menu_itemsচিত্রগুলি পুনরুদ্ধার করবে না কারণ img ট্যাগগুলি প্রকৃত কাস্টম মেনুতে সংরক্ষিত হয় না (কেবলমাত্র তাদের ফাইলের নামগুলি বর্ণনা ক্ষেত্রের মধ্যে রয়েছে, যেমন, "image1.png" )। কাস্টম ওয়াকার হ'ল আমাকে মেনু আউটপুটে img ট্যাগ সন্নিবেশ করানোর অনুমতি দেয়।
মারভেন্টাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.