আমি কাস্টম মেনুগুলি থেকে নাভি মেনু আইটেমগুলি কীভাবে বাদ / সরিয়ে ফেলতে পারি সে সম্পর্কিত তথ্যের সন্ধান করার চেষ্টা করেছি এবং আমি যে একমাত্র থ্রেড পেয়েছি তার কোনও উত্তর আমার কাছে কার্যকর ছিল না।
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, তবে এটি ভিতরে বাছাই করা হবে না , তাই না?