प्लगइन अपग्रेड: विजेट सेटिंग


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()कॉल गलत होना चाहिए क्योंकि यह विजेट को पूरी तरह से हटा देता है।

मुझे इस तरह की चीज़ों के लिए किसी भी प्रकार के मानक को खोजने में परेशानी हो रही है और आप किसी भी विचार, विचार, या लिंक को सुनना पसंद करेंगे, आपको ऐसा कुछ करना होगा।

किसी भी सहायता के लिए अग्रिम रूप से धन्यवाद।

संपादित करें:

यह वास्तव में लाइसेंस कुंजी को ट्रैक करने या WP रेपो पर होस्ट नहीं किए गए प्लगइन्स को अपग्रेड करने के बारे में सवाल नहीं है। जब उपयोगकर्ता नवीनीकरण होता है, तो प्लगइन के 2 संस्करण के बीच सेटिंग अपडेट हो रही है।

उदाहरण:

संस्करण 1.0.0 में एक सेटिंग फ़ील्ड है name

अच्छी तरह से संस्करण 1.1.0 में हम तय करते हैं कि हमें पहले और अंतिम नाम दोनों की आवश्यकता है ताकि हम पुरानी सेटिंग को बदल दें 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
)

मैंने अभी यह लेख टट्सप्लस पर देखा, मैंने यह सब पढ़ा भी नहीं है, लेकिन ऐसा लगता है कि यह आपके सहयोगी हैं। एक लाइसेंस कंट्रोल्ड थीम और प्लगिन अपडेट सिस्टम बनाएं
ऑनिंगशिप

@OnethingSimple उत्तर के लिए धन्यवाद, लेकिन यह बिल्कुल नहीं लगता है कि मैं क्या करने जा रहा हूं। मैं इसे और अधिक स्पष्ट करने के लिए प्रश्न को अपडेट करूंगा।
निक यंग

कोई भी मौका हमें मिल सकता है जो विजेट सेटिंग संरचना की तरह दिखता है जो आप पढ़ रहे हैं (भले ही आपको कुछ मूल्यों को बदलना पड़े)। जो गलत हो रहा है, उसे अंदाजा लगाने में मदद कर सकता है। उदाहरण के लिए गूंज "<पूर्व>"। प्रिंट_आर ($ विजेट, सच)। "</ pre>";
Privateer

@ प्रॉपर्टी अब ओपी के निचले हिस्से में लागू है।
निक यंग

जवाबों:


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हुक के बजाय इसे जोड़ने से बहुत बड़ा अंतर है ? मुझे पूरा यकीन था कि वे उसी समय फायर कर देंगे। आपकी सहायता के लिए धन्यवाद।
निक यंग

@NickYoung हुक में कोई अंतर नहीं है। लेकिन आपके पहले कोड में स्निपेट (यह मेरा जैसा है) दूसरा (भीतरी) foreachगलत है।
gmazzap

मुझे आपके द्वारा लिखे गए कोड को लागू करने का मौका मिला। यह बहुत अच्छा काम करता है, लेकिन मुझे अभी भी वही समस्या हो रही है जो मुझे पहले मिल रही थी। यह विकल्पों को सफलतापूर्वक स्थानांतरित करता है, लेकिन प्लगइन के लिए अपग्रेड रूटीन चलाने के बाद विजेट आउटपुट करना बंद कर देता है यह मुख्य HTML है और केवल विजेट का शीर्षक दिखाता है। अगर मैं विजेट सेटिंग में जाता हूं और बस सेव बटन पर क्लिक करता हूं तो यह फिर से पॉप हो जाता है। कोई विचार?
निक यंग

मेरी अंतिम टिप्पणी में जोड़ने के लिए। इसके विकल्पों को सही तरीके से अपडेट किया जा रहा है लेकिन वास्तविक उदाहरण नहीं है। क्या यह भी एक संभावना है?
निक यंग

नोप ने सभी कैशिंग को अक्षम कर दिया। एक ही समस्या के साथ 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

मेरे सिर के ऊपर, विजेट के प्रत्येक उदाहरण को किसी प्रकार की विशिष्ट आईडी दी जाती है। मैं कहना चाहता हूं कि विजेट के लिए कुंजी के लिए एक उपसर्ग बन जाता है।

मुझे कुछ समय पहले यह याद आया लेकिन यह याद नहीं था कि सटीक क्या थे, क्षमा करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.