ওয়ার্ডপ্রেস এপিআই মেনু / সাবমেনু অর্ডার


11

আমি একটি সন্তানের থিম ব্যবহার উন্নয়নশীল করছি ওয়ার্ডপ্রেস 3.4.2 এবং ডেভেলপমেন্ট সংস্করণ বিকল্প ফ্রেমওয়ার্ক দ্বারা ডেভিড দাম । এটি আমার প্রথম থিম এবং আমি এটিতে তুলনামূলকভাবে নতুন, তাই আমি ওয়ার্ডপ্রেস কোডেক্সে নজর রেখেছি এবং এপিআইতে আইটেম নিবন্ধকরণ করে দেখেছি ।

আমার থিমের বাইরের কোনও বাহ্যিক ফাইলগুলির সাথে কোনও ছলছল না করে আমি ভাবছিলাম যে থিম বিকল্প পৃষ্ঠাটি উপস্থিতি মেনুর স্তরক্রমের মধ্যে যেখানে অবস্থিত সেখানে আবার ব্যবস্থা করার কোনও উপায় ছিল - তাই যখন আমার থিমটি সক্রিয় হয় তখন অবস্থানটি পছন্দ হয় না প্রথম ইমেজ কিন্তু দ্বিতীয় মত।

পুরাতননতুন

আমি জানি আপনি হয় একটি মেনু তৈরি করতে পারেন (যেমন উপস্থিতি ট্যাব, প্লাগইনস , ব্যবহারকারীগণ ইত্যাদি) অথবা একটি উপ-মেনু ( থিমস , উইজেটস , মেনু ইত্যাদি), তবে আমি কীভাবে একটি উপ-মেনু সেট করতে যাব, দ্বিতীয় উপর থেকে?

আমি যা সংগ্রহ করি সেখান থেকে কোথাও কোথাও একটি আদেশ আহ্বান করা হচ্ছে এবং functions.phpফাইলের মধ্যে অন্য কোনও অতিরিক্ত পৃষ্ঠাগুলি সেগুলির পরে স্থাপন করা হবে?

আমার ফাংশন.এফপি ফাইলটিতে:

// Add our "Theme Options" page to the Wordpress API admin menu.
if ( !function_exists( 'optionsframework_init' ) ) {
    define( 'OPTIONS_FRAMEWORK_DIRECTORY', get_template_directory_uri() . '/inc/' );
    require_once dirname( __FILE__ ) . '/inc/options-framework.php';
}

ধন্যবাদ।


আপনি আপডেট ফাংশন চেষ্টা করে?
আদম

আমাকে @ ইউজারবুউসার ফিরে আসার জন্য ধন্যবাদ। আমি আপনার আপডেট হওয়া স্ক্রিপ্টটি অনুলিপি করেছি এবং মনে হচ্ছে এটি অন্য কোনও ব্যক্তিকে ওভাররাইড না করে তালিকাগুলি উপরে এবং নীচে সরিয়ে নিয়েছে ... তবে নতুন আপডেটের সাথে আমি উইজেটস মেনুতে এখনও কয়েকটি ত্রুটি পেয়েছি । Warning: Invalid argument supplied for foreach() in /wp-content/themes/mythemename/functions.php on line 1444 লাইন 1444: foreach ($submenu[$menus] as $index => $value){ এবং Warning: ksort() expects parameter 1 to be array, null given in /wp-content/themes/mythemename/functions.php on line 1468 লাইন 1468: ksort($submenu[$menus]);
ব্যবহারকারী 1752759

আপনি যদি দয়া করে এটি একবার দেখে নিতে পারেন, এটি দুর্দান্ত।
ব্যবহারকারী1752759

উত্তর:


3

এখানে একটি উদাহরণ;

প্রথমে সাব মেনু আইটেমগুলির অ্যারে কী এর উপর ভিত্তি করে তার ক্রমটি বের করার জন্য আপনি var_dumpmen সাবমেনু গ্লোবাল ভেরিয়েবলের উপর একটি করতে পারেন যা নিম্নলিখিতগুলি আউটপুট দেয়;

(আমি উদাহরণ হিসাবে পোস্ট মেনু এবং সাব মেনু ব্যবহার করছি)

  //shortened for brevity....

  ["edit.php"]=>
  array(6) {
    [5]=>
    array(3) {
      [0]=> string(9) "All Posts"
      [1]=> string(10) "edit_posts"
      [2]=> string(8) "edit.php"
    }
    [10]=>
    array(3) {
      [0]=> string(7) "Add New"
      [1]=> string(10) "edit_posts"
      [2]=> string(12) "post-new.php"
    }
    [15]=>
    array(3) {
      [0]=> string(10) "Categories"
      [1]=> string(17) "manage_categories"
      [2]=> string(31) "edit-tags.php?taxonomy=category"
    }
    [17]=>
    array(3) {
      [0]=> string(14) "Sub Menu Title"
      [1]=> string(10) "edit_posts"
      [2]=> string(17) "sub_menu_page.php"
    }
  }

আমরা দেখতে পাচ্ছি যে আমার সাব মেনু আইটেমটি ডিফল্ট আইটেমগুলির পরে 17 এর কী দিয়ে অ্যারেতে যুক্ত হয়।

উদাহরণস্বরূপ যদি আমি আমার সাব মেনু আইটেমটি যুক্ত করতে চাই, সরাসরি সমস্ত পোস্ট সাব মেনু আইটেমের পরে আমার অ্যারে কীটি যথাক্রমে,,,, 8 বা ৯ (যেকোনও কিছুর পরে 5 এবং 10 এর আগে সেট করে) করা দরকার।

এইভাবে আপনি এটি ...

function change_submenu_order() {

    global $menu;
    global $submenu;

     //set our new key
    $new_key['edit.php'][6] = $submenu['edit.php'][17];

    //unset the old key
    unset($submenu['edit.php'][17]);

    //get our new key back into the array
    $submenu['edit.php'][6] = $new_key['edit.php'][6];


    //sort the array - important! If you don't the key will be appended
    //to the end of $submenu['edit.php'] array. We don't want that, we
    //our keys to be in descending order
    ksort($submenu['edit.php']);

}

ফলাফল,

  ["edit.php"]=>
  array(6) {
    [5]=>
    array(3) {
      [0]=> string(9) "All Posts"
      [1]=> string(10) "edit_posts"
      [2]=> string(8) "edit.php"
    }
    [6]=>
    array(3) {
      [0]=> string(14) "Sub Menu Title"
      [1]=> string(10) "edit_posts"
      [2]=> string(17) "sub_menu_page.php"
    }
    [10]=>
    array(3) {
      [0]=> string(7) "Add New"
      [1]=> string(10) "edit_posts"
      [2]=> string(12) "post-new.php"
    }
    [15]=>
    array(3) {
      [0]=> string(10) "Categories"
      [1]=> string(17) "manage_categories"
      [2]=> string(31) "edit-tags.php?taxonomy=category"
    }
  }

... একবার চেষ্টা করে দেখুন আপনি কীভাবে যাবেন তা আমাদের জানান!

আপডেট 1:

এটি আপনার ফাংশন.এফপি ফাইলে যুক্ত করুন;

function change_post_menu_label() {

    global $menu;
    global $submenu;

    $my_menu  = 'example_page'; //set submenu page via its ID
    $location = 1; //set the position (1 = first item etc)
    $target_menu = 'edit.php'; //the menu we are adding our item to

    /* ----- do not edit below this line ----- */


    //check if our desired location is already used by another submenu item
    //if TRUE add 1 to our value so menu items don't clash and override each other
    $existing_key = array_keys( $submenu[$target_menu] );
    if ($existing_key = $location)
    $location = $location + 1;

    $key = false;
    foreach ( $submenu[$target_menu] as $index => $values ){

        $key = array_search( $my_menu, $values );

        if ( false !== $key ){
            $key = $index;
            break;
        }
    }

     $new['edit.php'][$location] = $submenu[$target_menu][$key];
     unset($submenu[$target_menu][$key]);
     $submenu[$target_menu][$location] = $new[$target_menu][$location];

    ksort($submenu[$target_menu]);

}

আমার আপডেটে আপনার মেনু অবস্থানের সেটিং পরিচালনা করার জন্য কিছুটা সহজ উপায় অন্তর্ভুক্ত রয়েছে, আপনাকে কেবল আপনার সাবমেনু পৃষ্ঠার নাম এবং মেনুটির মধ্যে আপনি যে অবস্থানটি চান তা নির্ধারণ করতে হবে। তবে আপনি যদি $locationকোনও বিদ্যমান কী এর সমান সাবমেনু পৃষ্ঠা নির্বাচন করেন তবে এটি আপনার সাথে সেই কীটি ওভাররাইড করবে, সুতরাং মেনু আইটেমটি তার জায়গায় আপনার মেনু আইটেমটির সাথে অদৃশ্য হয়ে যাবে। আপনার মেনুটি সঠিকভাবে অর্ডার করার জন্য সংখ্যাটি বৃদ্ধি বা হ্রাস হ্রাস যদি তা হয়। অনুরূপ, যদি কেউ একটি প্লাগইন ইনস্টল করে যা একই মেনু অঞ্চলটিকে প্রভাবিত করে এবং যার জন্য $locationআপনার সাবমেনু আইটেমের সমান হয় তবে একই সমস্যা দেখা দেবে। এটি রোধ করার জন্য কায়সারের উদাহরণ এটির জন্য কিছু প্রাথমিক পরীক্ষা করে।

আপডেট 2:

আমি কোডের একটি অতিরিক্ত ব্লক যুক্ত করেছি যা অ্যারের মধ্যে থাকা সমস্ত কীগুলি আমাদের পছন্দসইটির বিরুদ্ধে পরীক্ষা করে $locationএবং যদি কোনও মিল খুঁজে পাওয়া যায় তবে আমরা একে অপরের উপরের নিয়ন্ত্রণে থাকা মেনু আইটেমগুলি এড়ানোর জন্য আমাদের $locationমান বাড়িয়ে তুলব 1। এটি তার জন্য দায়ী কোড,

   //excerpted snippet only for example purposes (found in original code above)
   $existing_key = array_keys( $submenu[$target_menu] );
   if ($existing_key = $location)
   $location = $location + 1;

আপডেট 3: (একাধিক সাব মেনু আইটেম বাছাই করতে স্ক্রিপ্ট সংশোধিত)

add_action('admin_init', 'move_theme_options_label', 999);

function move_theme_options_label() {
    global $menu;
    global $submenu;

$target_menu = array(
    'themes.php' => array(
        array('id' => 'optionsframework', 'pos' => 2),
        array('id' => 'bp-tpack-options', 'pos' => 4),
        array('id' => 'multiple_sidebars', 'pos' => 3),
        )
);

$key = false;

foreach ( $target_menu as $menus => $atts ){

    foreach ($atts as $att){

        foreach ($submenu[$menus] as $index => $value){

        $current = $index;  

        if(array_search( $att['id'], $value)){ 
        $key = $current;
        }

            while (array_key_exists($att['pos'], $submenu[$menus]))
                $att['pos'] = $att['pos'] + 1;

            if ( false !== $key ){

                if (array_key_exists($key, $submenu[$menus])){
                    $new[$menus][$key] = $submenu[$menus][$key];
                    unset($submenu[$menus][$key]);
                    $submenu[$menus][$att['pos']] = $new[$menus][$key];

                } 
            }
        }
    }
}

ksort($submenu[$menus]);
return $submenu;

}

উপরের উদাহরণে আপনি $target_menuভেরিয়েবলের মধ্যে প্যারামিটারগুলি নির্ধারণ করে একাধিক সাব মেনু এবং উপ মেনু প্রতি একাধিক আইটেমগুলিকে টার্গেট করতে পারেন যা মানগুলির একটি বহুমাত্রিক অ্যারে ধারণ করে।

$target_menu = array(
//menu to target (e.g. appearance menu)
'themes.php' => array(
    //id of menu item you want to target followed by the position you want in sub menu
    array('id' => 'optionsframework', 'pos' => 2),
    //id of menu item you want to target followed by the position you want in sub menu
    array('id' => 'bp-tpack-options', 'pos' => 3),
    //id of menu item you want to target followed by the position you want in sub menu
    array('id' => 'multiple_sidebars', 'pos' => 4),
    )
 //etc....
);

এই পুনর্বিবেচনাটি উপ-মেনু আইটেমগুলিতে একে অপরের উপর একই লিখিত (অবস্থান) থাকলে ওভার-লিখনকে বাধা দেবে, কারণ এটি কোনও উপলব্ধ কী (পজিশন) অস্তিত্ব না পাওয়া অবধি চক্রাকারে চলে যাবে।


দ্রুত প্রতিক্রিয়া ব্যবহারকারীর জন্য ধন্যবাদ, তবে আমি এই সমস্ত কিছুর জন্য মোটামুটি নতুন, তাই দয়া করে আমার সাথে সহ্য করুন। উপরে আপনার স্ক্রিপ্ট / কোডটি কীভাবে প্রয়োগ করা যায় এবং এটি কতটা সংক্ষিপ্তভাবে লেখা হয়েছে তার কারণে কোন ফাইলটি এটি স্থাপন করা দরকার তা আমি ঠিক নিশ্চিত নই - দয়া করে বিস্তারিত বলুন। যদিও এই উদাহরণটি দিয়ে কাজ করা এবং প্রয়োজনীয় নম্বর আউটপুট করা হচ্ছে ... যদি ব্যবহারকারী পরে কোনও প্লাগইন ইনস্টল করতে হয় তবে এর মধ্যে কয়েকটি উপ-স্তরের ভিতরে অতিরিক্ত শীর্ষ স্তরের মেনু তৈরি করা হয়েছিল (যেমন একটি ই-বাণিজ্য সমাধান), এটি কি অ্যারের কীটি প্রভাবিত করে এবং এটি করার জন্য সেট করা কী হয়েছে তা ব্রেক করুন?
ব্যবহারকারী1752759

1
@ রব একটি সামান্য সামঞ্জস্য করেছেন যা মেনু আইটেমগুলি একে অপরকে ওভাররাইড করে এমন পরিস্থিতি এড়াতে সহায়তা করে।
আদম

@ ব্যবহারকারী1752759 এর উপরের সাথে কী করার আছে? আপনি আপনার উপরের মন্তব্যে ফাংশন.এফপি ফাইলের পুরো পথটি কী? এই ফাইলের মধ্যে কোডটি কী? শেষ কথোপকথনে এটি আপনার পক্ষে কাজ করেছিল। এটি আমার জন্যও কাজ করে। সুতরাং আমি সন্দেহ করছি যে এখানে অন্য কিছু আপনার কোডের মধ্যে মিস হতে পারে, যদি আমি গতবার সঠিকভাবে স্মরণ করি তবে আপনি কোডের দুটি স্নিপেট নকল করেছেন এবং যদি আপনার ফাংশনটির চারপাশে সঠিক বন্ধনী না থাকে।
আদম

আমাকে @ ইউজারবুউসার ফিরে আসার জন্য ধন্যবাদ। আমি আপনার আপডেট হওয়া স্ক্রিপ্টটি অনুলিপি করেছি এবং মনে হচ্ছে এটি অন্য কোনও ব্যক্তিকে ওভাররাইড না করে তালিকাগুলি উপরে এবং নীচে সরিয়ে নিয়েছে ... তবে নতুন আপডেটের সাথে আমি উইজেটস মেনুতে এখনও কয়েকটি ত্রুটি পেয়েছি। Warning: Invalid argument supplied for foreach() in /wp-content/themes/mythemename/functions.php on line 1444 লাইন 1444: foreach ($submenu[$menus] as $index => $value){ এবং Warning: ksort() expects parameter 1 to be array, null given in /wp-content/themes/mythemename/functions.php on line 1468 লাইন 1468: ksort($submenu[$menus]);
user1752759

আপনি যদি দয়া করে এটি একবার দেখে নিতে পারেন, এটি দুর্দান্ত।
ব্যবহারকারী 1752759

2

প্রশাসক মেনু (এবং এর সমস্যাগুলি)

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

প্রথমে আমার মনে রাখতে হবে, স্ক্রিবু অ্যাডমিন মেনু প্যাচে কাজ করছে যা হ্যান্ডলিংটিকে আরও সহজ করে তুলবে। বর্তমান কাঠামোটি বেশ গণ্ডগোল পেয়েছে এবং আমি এটি সম্পর্কে একটি নিবন্ধ লিখেছি যা শীঘ্রই পুরানো হবে। WP 3.6 থেকে জিনিসগুলি সম্পূর্ণরূপে পরিবর্তিত হওয়ার প্রত্যাশা করুন।

তারপরে বিন্দুটিও আছে, থিমগুলির জন্য আপনার বিকল্প পৃষ্ঠাগুলি ব্যবহার করা উচিত নয়। আজকাল আছে - তার জন্য »থিম কাস্টমাইজার

প্লাগইন

আমি এমন একটি প্লাগইন লিখেছিলাম যা এটি টোয়েন্টিভ্যালভেন / টেন বিকল্প পৃষ্ঠার জন্য ডিফল্ট "থিম বিকল্প" পৃষ্ঠা দিয়ে পরীক্ষা করে। আপনি দেখতে পাচ্ছেন, এমন কোনও আসল এপিআই নেই যা কোনও অবস্থানের অনুমতি দেয়। সুতরাং আমাদের বিশ্বব্যাপী বাধা দিতে হবে।

সংক্ষেপে: কেবল মন্তব্যগুলি অনুসরণ করুন এবং অ্যাডমিন বিজ্ঞপ্তিগুলি একবার দেখুন, আমি আপনাকে কিছু ডিবাগ আউটপুট দিতে যোগ করেছি।

<?php
/** Plugin Name: (#70916) Move Submenu item */

add_action( 'plugins_loaded', array( 'wpse70916_admin_submenu_items', 'init' ) );

class wpse70916_admin_submenu_items
{
    protected static $instance;

    public $msg;

    public static function init()
    {
        is_null( self :: $instance ) AND self :: $instance = new self;
        return self :: $instance;
    }

    public function __construct()
    {
        add_action( 'admin_notices', array( $this, 'add_msg' ) );

        add_filter( 'parent_file', array( $this, 'move_submenu_items' ) );
    }

    public function move_submenu_items( $parent_file )
    {
        global $submenu;
        $parent = $submenu['themes.php'];

        $search_for = 'theme_options';

        // Find current position
        $found = false;
        foreach ( $parent as $pos => $item )
        {
            $found = array_search( $search_for, $item );
            if ( false !== $found )
            {
                $found = $pos;
                break;
            }
        }
        // DEBUG: Tell if we didn't find it.
        if ( empty( $found ) )
            return $this->msg = 'That search did not work out...';

        // Now we need to determine the first and second item position
        $temp = array_keys( $parent );
        $first_item  = array_shift( $temp );
        $second_item = array_shift( $temp );

        // DEBUG: Check if it the item fits between the first two items:
        $distance = ( $second_item - $first_item );
        if ( 1 >= $distance )
            return $this->msg = 'We do not have enough space for your item';

        // Temporary container for our item data
        $target_data = $parent[ $found ];

        // Now we can savely remove the current options page
        if ( false === remove_submenu_page( 'themes.php', $search_for ) )
            return $this->msg = 'Failed to remove the item';

        // Shuffle items (insert options page)
        $submenu['themes.php'][ $first_item + 1 ] = $target_data;
        // Need to resort the items by their index/key
        ksort( $submenu['themes.php'] );
    }

    // DEBUG Messages
    public function add_msg()
    {
        return print sprintf(
             '<div class="update-nag">%s</div>'
            ,$this->msg
        );
    }
} // END Class wpse70916_admin_submenu_items

গুড লাক এবং মজা আছে.


2

কাস্টম ফিল্টার

এটি অর্জনের আরও একটি সম্ভাবনা রয়েছে। আমাকে কেন জিজ্ঞাসা করবেন না কেন আমি এটি সম্পর্কে আগে ভেবে দেখিনি। যাইহোক, একটি কাস্টম মেনু অর্ডার নিবেদিত একটি ফিল্টার আছে। কেবলমাত্র trueএকটি কাস্টম অর্ডারের অনুমতি দিতে এটি সেট করুন । তারপরে আপনি মূল মেনু আইটেমগুলি অর্ডার করতে দ্বিতীয় হুক পেয়েছেন। সেখানে আমরা কেবল বাধা দিই global $submenuএবং আমাদের সাব মেনু আইটেমগুলি ঘুরে দেখি ।

এখানে চিত্র বর্ণনা লিখুন

এই উদাহরণটিতে চলে আসে মেনু আইটেমটি উপরে উইজেট আইটেমটি তার কার্যকারিতা প্রকট। আপনি যা পছন্দ করেন তার সাথে এটি সামঞ্জস্য করতে পারেন।

<?php
defined( 'ABSPATH' ) OR exit;
/**
 * Plugin Name: (#70916) Custom Menu Order
 * Description: Changes the menu order of a submenu item.
 */

// Allow a custom order
add_filter( 'custom_menu_order', '__return_true' );
add_filter( 'menu_order', 'wpse70916_custom_submenu_order' );
function wpse70916_custom_submenu_order( $menu )
{
    // Get the original position/index
    $old_index = 10;
    // Define a new position/index
    $new_index = 6;

    // We directly interact with the global
    $submenu = &$GLOBALS['submenu'];
    // Assign our item at the new position/index
    $submenu['themes.php'][ $new_index ] = $submenu['themes.php'][ $old_index ];
    // Get rid of the old item
    unset( $submenu['themes.php'][ $old_index ] );
    // Restore the order
    ksort( $submenu['themes.php'] );

    return $menu;
}

আমি খুব আত্মবিশ্বাসী যখন এটি পিএইচপি @kaiser ব্যবহার করে আসে নই, কিন্তু আপনি সম্ভবত স্ক্রিপ্ট বাস্তবায়ন করার জন্য একটি উপায় জানি উপরে একই মধ্যে একাধিক আইটেম অন্তর্ভুক্ত করা হবে function wpse70916_custom_submenu_order( $menu )বলে, পুনরায়-অর্ডার না শুধু মেনু , কিন্তু থিম বিকল্পগুলি , উইজেটগুলি , সম্পাদক ইত্যাদি এটিকে একেবারে নমনীয় করে তোলে এবং যাতে আইটেমগুলি একে অপরকে ওভাররাইড করে না? ধন্যবাদ.
ব্যবহারকারী 1752759

@ user1752759 প্লাগইনটিতে ইতিমধ্যে এই নমনীয়তা রয়েছে। সংঘাতের নিরাপদতা (ওভাররাইডিং এড়ানো) অন্য সমস্যা। এটি আপনার 100% দৃশ্যে সম্ভব হবে না কারণ আপনি নিজের ক্রিয়াকে শেষ বরাদ্দ করতে পারবেন না। সবসময় এমন কিছু আছে যা পরে চালাতে পারে। যাইহোক: দয়া করে একটি নতুন প্রশ্ন খুলুন এবং এটির সাথে লিঙ্ক করুন।
কায়সার

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

দয়া করে কেবল একটি নতুন প্রশ্ন জিজ্ঞাসা করুন এবং এটির সাথে লিঙ্ক করুন। ধন্যবাদ।
কায়সার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.