অ্যারে হিসাবে উইজেট ক্ষেত্রের ডেটা কীভাবে সংরক্ষণ করবেন?


11

আমি একটি উইজেট তৈরি করছি, এটির জন্য প্রায় 10 আইডি সংরক্ষণ করা দরকার। এই মুহুর্তে আমি প্রতিটি আইডি পৃথক ক্ষেত্রে সংরক্ষণ করতে নিম্নলিখিত ফিল্ড পদ্ধতিটি ব্যবহার করছি। এটি ওয়ার্ডপ্রেসে পৃথকভাবে প্রতিটি ক্ষেত্রের ডেটা সঞ্চয় করে। অ্যারে ব্যবহার করে পরীক্ষার জন্য ওয়ার্ডপ্রেসে সমস্ত ক্ষেত্রের ডেটা কেবলমাত্র এক সারিতে সংরক্ষণ করা সম্ভব?

<input 
    class="widefat" 
    id="<?php echo $this->get_field_id('item1_id'); ?>" 
    name="<?php echo $this->get_field_name('item1_id'); ?>" 
    value="<?php echo $instance['item1_id']; ?>" 
    />

<input 
    class="widefat" 
    id="<?php echo $this->get_field_id('item2_id'); ?>" 
    name="<?php echo $this->get_field_name('item2_id'); ?>" 
    value="<?php echo $instance['item2_id']; ?>" 
    />

1
$instance হয় একটি অ্যারের এবং সব মান ধারণ করে। এবং 'কেবলমাত্র এক সারিতে সমস্ত ক্ষেত্রের ডেটা সঞ্চয় করতে' বলতে কী বোঝায়? আপনি কি একটি ডাটাবেস সারি বোঝাতে চেয়েছিলেন?
র‌্যালফ 912

উত্তর:


8

আপনাকে একই নামে একাধিক ক্ষেত্র সংগ্রহ করতে হবে ...

name="collect[1]"
name="collect[2]"

… এবং এটিতে আপনার উইজেট যুক্তি সামঞ্জস্য করুন।

এখানে একটি খুব সাধারণ ডেমো উইজেট রয়েছে:

<?php  # -*- coding: utf-8 -*-
/* Plugin Name: Store Options as array */

add_action( 'widgets_init', array ( 'T5_Array_Options_Widget', 'register' ) );

class T5_Array_Options_Widget extends WP_Widget
{
    /**
     * Constructor.
     */
    public function __construct()
    {
        parent::__construct( strtolower( __CLASS__ ), 'Array Demo' );
    }

    /**
     * Echo the settings update form
     *
     * @param array $instance Current settings
     */
    public function form( $instance )
    {
        $title = isset ( $instance['title'] ) ? $instance['title'] : '';
        $title = esc_attr( $title );

        printf(
            '<p><label for="%1$s">%2$s</label><br />
            <input type="text" name="%3$s" id="%1$s" value="%4$s" class="widefat"></p>',
            $this->get_field_id( 'title' ),
            'Title',
            $this->get_field_name( 'title' ),
            $title
        );

        $fields = isset ( $instance['fields'] ) ? $instance['fields'] : array();
        $field_num = count( $fields );
        $fields[ $field_num + 1 ] = '';
        $fields_html = array();
        $fields_counter = 0;

        foreach ( $fields as $name => $value )
        {
            $fields_html[] = sprintf(
                '<input type="text" name="%1$s[%2$s]" value="%3$s" class="widefat">',
                $this->get_field_name( 'fields' ),
                $fields_counter,
                esc_attr( $value )
            );
            $fields_counter += 1;
        }

        print 'Fields<br />' . join( '<br />', $fields_html );
    }

    /**
     * Renders the output.
     *
     * @see WP_Widget::widget()
     */
    public function widget( $args, $instance )
    {
        print $args['before_widget']
        . $args['before_title']
        . apply_filters( 'widget_title', $instance['title'] )
        . $args['after_title']
        . join( '<br />', $instance['fields'] )
        . $args['after_widget'];
    }

    /**
     * Prepares the content. Not.
     *
     * @param  array $new_instance New content
     * @param  array $old_instance Old content
     * @return array New content
     */
    public function update( $new_instance, $old_instance )
    {
        $instance          = $old_instance;
        $instance['title'] = esc_html( $new_instance['title'] );

        $instance['fields'] = array();

        if ( isset ( $new_instance['fields'] ) )
        {
            foreach ( $new_instance['fields'] as $value )
            {
                if ( '' !== trim( $value ) )
                    $instance['fields'][] = $value;
            }
        }

        return $instance;
    }

    /**
     * Tell WP we want to use this widget.
     *
     * @wp-hook widgets_init
     * @return void
     */
    public static function register()
    {
        register_widget( __CLASS__ );
    }
}

ব্যাক-এন্ড

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

সামনের অংশ

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


+1 খুব মার্জিত printfসিনট্যাক্স

একাধিক ক্ষেত্রের দুর্দান্ত উত্তর, তবে একটানা 2 টি ক্ষেত্র রাখার বিষয়ে কি কিছু আপডেট সম্ভব? আমি এটি আমার উইজেটে ব্যবহার করার চেষ্টা করছি তবে দাম / গন্তব্যের মতো আমার সারিতে 2 টি ক্ষেত্র থাকা দরকার, তবে কীভাবে তা পাওয়া যায় তা আমি বুঝতে পারি না, আমি সর্বদা একরকম ত্রুটি পাই।
আলেকসান্দার đorđević

@ আলেকসান্দারোরিভিভিć কেবল তার জন্য এইচটিএমএল লিখুন, এবং class="widefat"ক্ষেত্রগুলির জন্য ব্যবহার করবেন না ।
ফুসিয়া

আমি যদি শুধু ভাবি ঠিক তেমন। আমি বুঝতে পারি যে এটি ফিল্ড [0] [দাম] এবং ক্ষেত্র [0] [গন্তব্য] এবং এর মতো হিসাবে ডাটাবেসে সংরক্ষণ করার কথা রয়েছে? তবে কোনওভাবেই আমি এটি সঠিকভাবে সম্পন্ন করতে পারি না।
আলেকসন্দর Đorđević

কী কী অ্যারে হতে পারে যা কী / মান জোড়া রয়েছে?
ওয়ার্ল্ডওয়াল্বেদেবদেব

5

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

উইজেট

এই আমার উইজেট form। - এখানে তিনটি গুরুত্বপূর্ণ জিনিস

  1. array()উইজেটের মান সেট না করা থাকলে মানটি শূন্যে ডিফল্ট করার বিষয়টি নিশ্চিত করুন
  2. ফর্মটি <label> nameঅ্যাট্রিবিউটে লক্ষ্য করুন যে আমি []শেষে একটি সংযুক্ত করেছি । এটি পিএইচপিকে বলে যে আমি এই কীটির জন্য মানগুলির একটি অ্যারে জমা দিচ্ছি
  3. হিসাবে লেবেলে চেকবক্সটি মোড়ানো <label><input type="checkbox" ...></label>। - আমাদের প্রতিটি চেকবাক্সের একটি অনন্য বৈশিষ্ট্য থাকবে না id, সুতরাং <label> forবৈশিষ্ট্যটি কার্যকর হবে না। আমরা অনন্য আইডি তৈরি করতে পারি, তবে এটি একটি ঝামেলা। আপনি যদি কেবল ইনপুটটির চারপাশে লেবেলটি মুড়ে রাখেন তবে for+ টি সংযোগের ঝামেলা ছাড়াই লেবেলটি সঠিকভাবে যুক্ত হয়ে যায়id

এখন কোড

public function form($instance) {
  $title = isset($instance['title']) ? $instance['title'] : '';
  $categories = isset($instance['categories']) ? $instance['categories'] : array();
  ?>

  <p>
    <label for="<?php echo $this->get_field_id('title') ?>">
      <?php _e( 'Title:' ) ?>
    </label>
    <input class="widefat"
           id="<?php echo $this->get_field_id('title') ?>"
           name="<?php echo $this->get_field_name('title') ?>"
           value="<?php echo $title ?>" />
  </p>

  <p>Categories</p>
  <ul>
  <?php foreach (\get_categories() as $category): ?>
    <li>
      <label>
        <input type="checkbox"
             class="checkbox"
             name="<?php echo $this->get_field_name('categories') ?>[]"
             value="<?php echo $category->cat_ID ?>"
             <?php checked(in_array($category->cat_ID, $categories)) ?> />
        <?php echo $category->name ?>
      </label>
    </li>
  <?php endforeach ?>
  </ul>
  <?php
}

এবং এখানে আমার আপডেট ফাংশন

আমি একটি অ্যারের বিভাগ আইডি, যা সংখ্যা সংরক্ষণে আগ্রহী তাই আমি ব্যবহার array_mapসঙ্গে intvalতা নিশ্চিত করার জন্য সব পৃষ্ঠা উপাত্ত বৈধ পূর্ণসংখ্যা। অতিরিক্তভাবে, আমি array_filterকোনও অবৈধ জমাগুলি অপসারণ করতে ব্যবহার করি ।

// @param array $a - the new instance options
// @param arram $b - the old instance options
public function update($a, $b) {
  return array(
    'title'      => isset($a['title']) ? strip_tags($a['title']) : $b['title'],
    'categories' => isset($a['categories']) ? array_filter(array_map(function($id) { return intval($id); }, (array) $a['categories'])) : (array) $b['title']
  );
}

এই ওয়ার্ডপ্রেস স্টাফ বর্ণনা করা বিশেষত চ্যালেঞ্জিং। আপনার যদি কোনও প্রশ্ন থাকে তবে আমি বিস্তারিত জানাতে খুশি হব।

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