প্লাগইন আপগ্রেডিং: উইজেট সেটিংস


9

আমি এ নিয়ে কিছু গবেষণা করার চেষ্টা করেছি কিন্তু এখনও শক্ত কিছু পাই নি। আমার একটি প্লাগইন রয়েছে যা আমি শেষ সংস্করণ এবং নতুন সংস্করণের মধ্যে এবং উইজেটের সাথে কিছু আপডেট করেছি যা সেটিংসের কিছু নাম (ব্যাকএন্ডে) পরিবর্তন করে এবং এটি করতে আপগ্রেড রুটিন তৈরি করতে আমার সমস্যা হচ্ছে।

আমি এ পর্যন্ত যা করেছি যা দেখে মনে হয় (বেশিরভাগ ক্ষেত্রে) কাজটি হ'ল:

$widget = get_option( 'widget_name' );

if( is_array( $widget ) && ! empty( $widget ) ) {
    foreach( $widget as $a => $b ) {
        if( ! is_array( $b ) ) {
            continue;
        } 

        foreach( $b as $k => $v ) {
            $widget[$a]['setting1'] = $widget[$a]['oldsetting1'];
            $widget[$a]['setting2'] = $widget[$a]['oldsetting2'];
        }
    }

    update_option( 'widget_name', $widget );
}

আমার বেশিরভাগ পরীক্ষায় এটি ঠিকঠাক কাজ করে তবে সমস্যাটি হয়ে যায় যে পুরানো উইজেট আর এটির আউটপুট প্রদর্শন করে না। কেবলমাত্র উইজেটের শিরোনামটি প্রদর্শিত হবে। আমি প্রতিটি পৃথক উইজেট গিয়ে সংরক্ষণ করে এটি ঠিক করতে পারি এবং তারপরে এটি কার্যকর হবে, তবে আমি আমার ব্যবহারকারীদের এটি করতে চাই না।

আমি ভেবেছিলাম এরকম কিছু কাজ করতে পারে:

$settings = $widgets->get_settings();

foreach( $settings as $s ) {

    $s['setting1'] = $s['oldsetting1'];
    $s['setting2'] = $s['oldsetting2'];

    $widgets->save_settings( $s );

}

তবে মনে হচ্ছে save_settings()কলটি অবশ্যই ভুল হতে হবে কারণ এটি পুরোপুরি উইজেটটিকে সরিয়ে দেয়।

এর মতো কিছু করার জন্য যে কোনও প্রকারের মান খুঁজে পেতে আমার সমস্যা হচ্ছে এবং ঠিক এরকম কিছু করার জন্য আপনার কোনও ধারণা, ধারণা বা লিঙ্কগুলি শুনতে চাই।

কোনো সাহায্যের জন্য আগাম ধন্যবাদ।

সম্পাদনা করুন:

এটি আসলে লাইসেন্স কীগুলি ট্র্যাকিং বা ডাব্লুপি রেপোতে হোস্ট করা নেই এমন প্লাগইনগুলি আপগ্রেড করার বিষয়ে কোনও প্রশ্ন নয়। এটি আরও বেশি কী তা যখন কোনও ব্যবহারকারী আপগ্রেড হয় তখন একটি প্লাগইনের 2 সংস্করণের মধ্যে সেটিংস আপডেট করা।

উদাহরণ:

সংস্করণ 1.0.0 একটি সেটিং ক্ষেত্র আছে name

ভার্সন ১.১.০ এ আমরা সিদ্ধান্ত নিই যে আমাদের প্রথম এবং শেষ নাম উভয়ই দরকার তাই আমরা পুরানো সেটিংটি পরিবর্তন করে first_nameতারপরে একটি নতুন সেটিং যুক্ত করি last_name

কাস্টম পোস্ট টাইপের জন্য পোস্ট মেটা হিসাবে সংরক্ষণ করা থাকলে এই বিকল্পগুলি স্থানান্তর করা কোনও সমস্যা নয়:

$old_name = get_post_meta( $post->ID, 'name', true );
$first_name = update_post_meta ( $post->ID, 'first_name', true );
delete_post_meta( $post->ID, 'name' );

সুতরাং যে অংশ সহজ। যা নিয়ে আমার সমস্যা হচ্ছে তা মনে হচ্ছে খুব সহজ নয় এটি একই কাজটি করা কিন্তু WIDGET সেটিংসের জন্য।

আশা করি এটি কোনও বিভ্রান্তি দূর করবে এবং এর উত্তর সহজতর করতে সহায়তা করবে।

সম্পাদনা 2:

echo '<pre>' . print_r( $widget, true ) . '</pre>';উপরে প্রথম কোড অংশ থেকে ফলাফল :

Array
(
[2] => Array
    (
        [title] => Class Schedule
        [id] => 23
        [display_type] => grid
        [order] => asc
        [display_title_text] => Events on
        [paging] => 1
        [list_max_num] => 7
        [list_max_length] => days
        [list_start_offset_num] => 0
        [list_start_offset_direction] => back
        [gce_per_page_num] => 7
        [gce_events_per_page] => days
    )

[3] => Array
    (
        [title] => Examples
        [id] => 24
        [display_type] => grid
        [order] => asc
        [display_title_text] => Events on
        [paging] => 1
        [list_max_num] => 7
        [list_max_length] => days
        [list_start_offset_num] => 0
        [list_start_offset_direction] => back
        [gce_per_page_num] => 7
        [gce_events_per_page] => days
    )

[_multiwidget] => 1
)

আমি আজ এই নিবন্ধটি টুটস্প্লাসে দেখেছি, আমি এগুলি সব পড়িনি, তবে মনে হয় এটি আপনার মিত্র হিসাবে রয়েছে। একটি লাইসেন্স নিয়ন্ত্রিত থিম এবং প্লাগইন আপডেট সিস্টেম তৈরি করুন
ওনেথিংসিম্পল

@ ওথিংহিংসিম্পল উত্তরের জন্য ধন্যবাদ তবে আমি যা যাচ্ছি তার মতো দেখতে তেমন দেখাচ্ছে না। প্রশ্নটি আরও পরিষ্কার করার জন্য আমি আপডেট করব।
নিক ইয়ং

উইজেট সেটিংস কাঠামোটি আপনি যেভাবে পড়ছেন তা দেখতে আমরা কোনও ডাম্প পেতে পারি (যদিও আপনাকে কিছু মান পরিবর্তন করতে হবে)। এটি কী ভুল হচ্ছে তা ধারণা দিতে সহায়তা করতে পারে। উদাহরণস্বরূপ প্রতিধ্বনি "<pre>"। মুদ্রণ_আর ($ উইজেট, সত্য)। "</ pre>";
প্রাইভেটর

@ প্রাইভেটর এখন ওপি-র নীচে যুক্ত হয়েছে।
নিক ইয়ং

উত্তর:


3

আমি কেবল বিকল্পটি পরিবর্তন করার জন্য একটি দ্রুত পরীক্ষা করেছি এবং এটি কার্যকর বলে মনে হচ্ছে।

আমি যা করেছি তা হ'ল:

  1. মাত্র 2 ক্ষেত্র রয়েছে এমন একটি উইজেট লিখেছেন: "শিরোনাম" এবং "নাম"। আমার সাইডবারগুলিতে এই উইজেটের বেশ কয়েকটি উদাহরণ যুক্ত করুন। নিশ্চিত হয়ে নিন যে এগুলি সম্মুখভাগে সঠিকভাবে প্রদর্শিত হয়েছে।
  2. 3 টি ক্ষেত্র: "শিরোনাম" এবং "প্রথম নাম" ("নাম" প্রতিস্থাপন করতে) ব্যবহার করতে শ্রেণি সম্পাদনা করা হয়েছে এবং "শেষ নাম" যুক্ত করেছেন।
  3. 'widgets_init'উইজেট বিকল্পগুলি আপডেট করে এমন একটি ফাংশন কল করতে উইজেটটি নিবন্ধিত করে এমন ফাংশনটি সম্পাদনা করেছে :

    add_action( 'widgets_init', 'my_example_widget_register' );
    
    function my_example_widget_register() {
    
      $widget_name = 'my_example_widget';  // <-- You will probably replace this
    
      $options = get_option("widget_{$widget_name}");
    
      // if the widget is not updated, run a function that updates it
      if ($options && ! get_option("is_{$widget_name}_updated")) {
          // use class below to update options
          $updater = new MyExampleWidgetUpdater($widget_name, $options);
          $updater->update();
      }
    
      register_widget('My_Example_Widget'); // <-- You will probably replace this
    }
  4. উইজেট বিকল্পগুলি আপডেট করতে একটি সাধারণ ক্লাস লিখেছিলেন:

    class MyExampleWidgetUpdater
    {
    
      private $name;
      private $options;
    
      public function __construct($name, $options) {
         $this->name = $name;
         $this->options = $options;
      }
    
      public function update() {
        // loop all the options
        array_walk($this->options, function(&$option, $key) {
            if (is_array($option) && is_numeric($key)) {
              $option = $this->getOption($option);
            }
        });
        // update all options in DB
        update_option("widget_{$this->name}", $this->options);
        // set the widget as updated
        update_option("is_{$this->name}_updated", 1);
      }
    
      private function getOption($options) {
        if (!isset($options['name'])) {
           return $options;
        }
        $options['first_name'] = $options['name'];
        $options['last_name'] = '';
        unset($options['name']);
        return $options;
      }
    }
  5. পদ্ধতির "is_{$widget_name}_updated"ভিতরে থাকা বিকল্পটি সংরক্ষণ করার জন্য আমি উইজেট শ্রেণি সম্পাদনা করেছি update(), এই পদ্ধতিতে আপডেটার ক্লাসটি কখনও নতুন ব্যবহারকারীদের জন্য ডাকা হবে না যা কখনও পুরানো উইজেট ইনস্টল করে না

    class My_Example_Widget {
    
        ...
    
        public function update($new_instance, $old_instance) {
            ...
    
            $widget_name = 'my_example_widget';
            update_option("is_{$widget_name}_updated", 1);
        }
    }
  6. আমি আমার সাইটটি পরিদর্শন করেছি এবং পুরানো বিকল্পগুলির সাহায্যে সংরক্ষিত উইজেটগুলি নতুন বিকল্পগুলি ব্যবহার করে কোনও সমস্যা ছাড়াই প্রদর্শিত হবে। (অবশ্যই "শেষ নাম" সর্বদা খালি থাকে)।

একটি ভাল ধারণা "is_{$widget_name}_updated"বিকল্পটি প্রতিস্থাপন করতে পারে এবং একটি বিকল্প যা উইজেটের আসল সংস্করণ সংরক্ষণ করে, এইভাবে পরের বার আপনার আপডেটের প্রয়োজন হলে এটি কার্যকর হবে।


আপনার উত্তরটি এখনও পরীক্ষা না করেই সন্ধান করুন। আমি ঠিক ব্যবহার করে যা করেছি তার অনুরূপ মনে হচ্ছে update_option? আমি এখন ভাবছি হুক ব্যাপারটা যদি হয়? আমি এটিকে initহুক করে দিচ্ছি । widgets_initপরিবর্তে হুক এ যুক্ত করে কি একটি বিশাল পার্থক্য আছে ? আমি নিশ্চিত যে তারা একই সাথে গুলি চালিয়েছিল। আপনার সাহায্যের জন্য ধন্যবাদ.
নিক ইয়ং

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

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

আমার শেষ মন্তব্য যোগ করতে। এর মত বিকল্পগুলি সঠিকভাবে আপডেট করা হচ্ছে তবে আসল উদাহরণটি তা নয়। এটা কি কোন সম্ভাবনা?
নিক ইয়ং

নাহ সমস্ত ক্যাশে অক্ষম করেছে। একই সমস্যা সহ 2 টি পৃথক হোস্টেও পরীক্ষিত।
নিক ইয়ং

1

প্লাগইন আপডেটে সমস্ত সেটিংস স্বয়ংক্রিয়ভাবে আপগ্রেড করার পরিবর্তে কেবল একটি ভিন্ন কোণ থেকে ওজন করার জন্য, কেবলমাত্র "পুরানো" সেটিংস এবং মানচিত্রটি অন-ফ্লাইয়ে "নতুন" সেটিংসে পরীক্ষা করে দেখুন:

function widget( $args, $instance ) {
    if ( isset( $instance['old_setting'] ) )
         $instance = self::_version_compat( $instance );
}

static function _version_compat( $instance ) {
    $instance['new_setting'] = $instance['old_setting'];
    // etc.

    return $instance;
}

0

আমার মাথার শীর্ষে, উইজেটের প্রতিটি উদাহরণকে একরকম অনন্য আইডি দেওয়া হয়। আমি বলতে চাই যে এটি উইজেটের কীগুলির জন্য একটি প্রিফিক্স হয়।

আমি কিছুক্ষণ আগে এই কুকুরের কথা মনে করি তবে দুঃখিত যেগুলি ছিল তা মনে করতে পারছি না, দুঃখিত।

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