সেটিংস এপিআই এর সুবিধা কী কী?


13

আমাকে এ কথাটি বলার মাধ্যমে এই উপস্থাপনা করা যাক যে আমি ওয়ার্ডপ্রেসের সাথে খুব কমই কাজ করি - বাস্তবে, ওয়ার্ডপ্রেসে শেষবারের মতো আমি কোন সাইটটি 2.2 এর সময় ফিরে এসেছি। গতকাল আমি সবকিছু নিয়ে খুব ঝামেলা করেছি এবং একটি বেসিক মেনু প্লাগইন কাজ করার চেষ্টা করে এখানে বেশ কয়েকটি প্রশ্ন জিজ্ঞাসা করেছি।

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

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

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

    function __construct() {
        /* constructor stuff */
        $this->options = $this->db_options = get_option( 'de-menu-options' );
        if( $this->options === false ){
            $this->options = $this->defaults;
        }
        if (is_admin()) {
            add_action('admin_menu', array(&$this, 'admin_menu'));
        }   
        /* more stuff */

        // When WordPress shuts down we store changes to options
        add_action('shutdown', array(&$this, 'update'));
    }

    public function admin_menu() {
        add_options_page('DE Menu Options', 'DE Menu', 'manage_options', 'de-menu-options', array(&$this, 'options'));
        add_option('de-menu-options', $this->options);
    }

    public function options() {
        if (!current_user_can('manage_options')) {
            wp_die( __('You do not have sufficient permissions to access this page.') );
        }
        if ( !empty($_POST) && check_admin_referer('de-menu-options') ) {
            // These options are saved to the database at shutdown
            $this->options = array(
                "columns" => $_POST["de-menu-columns"],
                "maintenance" => $_POST["de-menu-maintenance"]
            );
            echo 'DE Menu options saved';
        }
?>

<div class="wrap">
    <h2>DE Menu Plugin</h2>
    <form method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>">
        <?php settings_fields('de-menu-options'); ?>
        <input type="checkbox" name="de-menu-maintenance" />
        <label for="de-menu-columns">Columns:</label>
        <input type="text" name="de-menu-columns" value="<?php echo $this->options['columns']; ?>" />
        <p class="submit">
        <input type="submit" name="de-menu-submit" value="Update Options »" />
        </p>
    </form>
</div>
<?php
    }

    function update() {
        // By storing all changes at the end we avoid multiple database calls
        $diff = array_diff( $this->options, $this->db_options );
        if( !empty( $diff )  ){
            update_option('de-menu-options', $this->options);
        }
    }

এখন সেটিংস এপিআই সহ আমার আরও নীচের মতো কিছু রয়েছে:

    function __construct() {
        /* constructor stuff */
        // Do I load options? Will they be loaded for me? Who knows?
        if (is_admin()) {
            add_action('admin_menu', array(&$this, 'admin_menu'));
            add_action('admin_init', array(&$this, 'admin_init'));
        }   
        /* more stuff */
        // Settings API should update options for me... I think
    }

    public function admin_menu() {
        add_options_page('DE Menu Options', 'DE Menu', 'manage_options', 'de-menu-options', array(&$this, 'options'));
        add_option('de-menu-options', $this->options);
    }

    public function admin_init() {
        register_setting('de-menu-options','de-menu-options',array(&$this,'validate'));
        add_settings_section('de-menu-main-options', 'Main Settings', 'options_section', 'de-menu-options');
        add_settings_field('de-menu-maintenance', 'Maintenance Mode', array(&$this,'options_maintenance'), 'de-menu-options', 'de-menu-main-options');
        add_settings_field('de-menu-columns', 'Columns', array(&$this,'options_columns'), 'de-menu-options', 'de-menu-main-options');
    }

    public function options() {
        if (!current_user_can('manage_options')) {
            wp_die( __('You do not have sufficient permissions to access this page.') );
        }
        if ( !empty($_POST) && check_admin_referer('de-menu-options') ) {
            // These options are saved to the database at shutdown
            $this->options = array(
                "columns" => $_POST["de-menu-columns"],
                "maintenance" => $_POST["de-menu-maintenance"]
            );
            echo 'DE Menu options saved';
        }
?>

<div class="wrap">
    <h2>DE Menu Plugin</h2>
    <form method="post" action="<?php echo $_SERVER['REQUEST_URI']; ?>">
        <?php settings_fields('de-menu-options'); ?>
        <?php do_settings_sections('de-menu-options'); ?>
        <p class="submit">
        <input type="submit" name="de-menu-submit" value="Update Options »" />
        </p>
    </form>
</div>
<?php
    }

    public function options_section() {
        echo '<p>' . __('Main description of this section here.','de-menu-lang') . '</p>';
    }

    public function options_maintenance() {
        echo "<input id='de-menu-maintenance' name='options[maintenance]' type='checkbox' />";
    }

    public function options_columns() {
        echo "<input id='de-menu-columns' name='options[columns]' type='checkbox' value=".$this->options['columns']."/>";
    }

    function validate($options) {
        return $options; // I guess?
    }

স্ক্রোলবারগুলি থেকে সম্ভবত এটি বেদনাদায়ক স্পষ্ট যে কোডটি দুটি মাত্র বিকল্পের সাথে ইতিমধ্যে কোড দীর্ঘ longer আমি যে মন্তব্য করছি তা সম্পূর্ণরূপে বুঝতে পারছি না এমন মন্তব্যগুলি থেকে এটি সমালোচিত obvious তারপরে এই সমস্তটি সম্পাদন করার জন্য 5 টি নতুন ফাংশন (এবং কেবল 1 টি অপসারণ) করার বিষয়টি রয়েছে।

সুতরাং এই অতিরিক্ত কাজটি থেকে আমি কী সুবিধা পাচ্ছি?


এ জাতীয় ক্ষেত্রে এগুলি ব্যবহার করবেন না। আমি মনে করি তারা পিএইচপি প্রারম্ভিকদের উদ্দেশ্যে, যাদের তাদের প্লাগইন / থিমের ভিতরে 3-4 টি বিকল্প প্রয়োজন। এটি এমন একটি "বৈশিষ্ট্য" যা কখনও প্রয়োগ করা উচিত ছিল না ... এটি অন্য একটি এপিআই এর মূলত একটি এপিআই :) :)
onetrickpony

3
আমি যা লিখি তার জন্য আমি সেটিংস এপিআই ব্যবহার করি, এটি সমস্ত নির্ভর করে আপনি কীভাবে এটি ব্যবহার করেন, নোট আপনি এমনকি এপিআই ব্যবহার না করেও ব্যবহার করতে পারেন add_settings_sectionএবং add_settings_fieldtwo দুটি ফাংশন আপনার কোডে কোনও কিছুর চেয়ে বেশি ফুল যোগ করে , সেগুলি এড়াতে এবং আপনি ব্লাট এড়ান ..
t31os

1
আমি t3los একই কাজ: সেটিংটি নিজেই নিবন্ধ করুন, তারপরে আমি আমার সেটিংস পৃষ্ঠায় HTML এ ফর্মগুলিতে কেবল কোড করি। আপনি যদি এটি করার খুব সহজ উপায়টি দেখতে চান এবং কোডটি পরে রাখেন, তবে ইওস্টের ওয়ার্ডপ্রেস এসইও প্লাগইনটি দেখুন।
chrisguitarguy

উত্তর:


8

আমার দৃষ্টিকোণ যে প্রধান উদ্দেশ্য এবং সেটিংস API সুবিধার হয় কাঠামো

এটি জটিল সেটিংস সেটআপগুলি রাখতে সহায়তা করে:

  • সুশৃঙ্খল (নিবন্ধকরণ এবং বিভাগগুলির যুক্তি);
  • সুরক্ষিত (ননেসেস, বৈধতা কলব্যাকস);
  • এক্সটেনসিবল (অন্য পৃষ্ঠায় ingুকানো বা হুক করার অনুমতি দেওয়া)।

যেমন কোনও কাঠামোগত ওভারহেডের মতো এটি আরও জটিল ব্যবহারের ক্ষেত্রে উপকৃত হয় এবং কম সহজ সাধারণকে উপকার করে।

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


এই টিউটোরিয়ালটির সাহায্যে অবশেষে আমি আমার সেটিংস পৃষ্ঠাটি পেয়েছি: alisothegeek.com/2011/01/wordpress-settings-api-tutorial-1 এবং স্যুইচ বিবৃতি এবং সহায়ক ফাংশনগুলির সাহায্যে আমাকে অবশ্যই বলতে হবে যে জিনিসগুলি এখন আরও সুশৃঙ্খল আমার কোডে (যেহেতু আমি আমার দুটি পরীক্ষার সেটিংস থেকে 15-20 মোট সেটিংসে যাওয়ার পরিকল্পনা করছি তাই দুর্দান্ত) nice
স্টিভেন্ডেসু

1
@ স্টিভেন_ডেসু হ্যাঁ, চলমান রসিকতা হল সেটিংস এপিআই ব্যবহার করা প্রত্যেক ব্যক্তি এটির জন্য একটি ফ্রেমওয়ার্ক লেখেন। :) দম্পতি সহায়তার কার্যাদি প্রায় অনিবার্য। এছাড়াও নোট করুন যে সেটিংস এপিআই চূড়ান্ত হিসাবে বিবেচিত হবে না এবং ভবিষ্যতে এটি উন্নত করার জন্য (অস্পষ্ট) পরিকল্পনা রয়েছে (আমি মনে করি এটি 3.3 পরিকল্পনার প্রসঙ্গে উল্লেখ করা হয়েছিল)।
রাস্ট

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

5

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

সুবিধা (অন্যান্য জিনিসগুলির মধ্যে):

  • সেটিংস এপিআই অবিশ্বস্ত ব্যবহারকারীর ডেটা স্যানিটাইজেশনকে বাধ্য করে।
  • সেটিংস এপিআই প্রতিটি বিকল্পের জন্য পৃথক ডিবি প্রবেশের পরিবর্তে একক wp_options DB এন্ট্রির ফলস্বরূপ বিকল্পগুলি একটি বিকল্প অ্যারে হিসাবে নিবন্ধিত হতে বাধ্য করে
  • সেটিংস এপিআই সেটিংস ফর্মটির সুরক্ষা কঠোর করতে সহায়তা করে
  • সেটিংস এপিআই, অ্যাডমিন ইউআই-কে মূল অ্যাডমিন ইউআইয়ের সাথে সামঞ্জস্য করে, যার ফলে আরও ভাল ইউএক্স হয়

সুতরাং এটি সুরক্ষা এবং নান্দনিক মানকে বাধ্যতামূলক করে যা আমি এর সাহায্য ছাড়াই ইতিমধ্যে অনুসরণ করেছি? যদিও আপনি সংযুক্ত টিউটোরিয়ালটি দিয়ে পড়ব। যদি সেটিংস
এপিআইটিকে

আপনি কি জানেন যে উত্স কোডটি আপনি ফাংশনগুলি প্রয়োগ করে oenology_get_settings_by_tab()এবং oenology_get_default_optionsপ্রথমে কোনও সংজ্ঞা না দিয়েই নির্দেশ করেছেন? আমি ভেবেছিলাম 209 লাইন কোডে (মন্তব্যগুলি এবং ফাঁকা লাইনগুলি সরিয়ে দেওয়ার পরে) এটি যথেষ্ট খারাপ, তবে একবার যদি এই ফাংশনগুলি সংজ্ঞায়িত করা হয় তবে এটি আরও দীর্ঘতর হবে ... চারটি বিকল্পের জন্য?
স্টিভেন্ডেসু

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

0

এই পোস্ট করার জন্য ধন্যবাদ, আমি ঠিক একই জিনিস ভাবছিলাম। প্রচুর ফাংশন।

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

সুতরাং এখানে আপনার কোড পুনরায় সম্পন্ন করা হয়। কয়েকটি নোট:

  • আমার উদাহরণ দুটি সহজ বিকল্প (ডি_ডাব্লু, ডি_এইচ) এবং একটি অ্যারের বিকল্প (ডি_উইথ_হাইট) প্রদর্শন করে।
  • সর্বদা ব্যবহারকারীর ইনপুট স্যানিটাইজ করুন। উদাহরণ হিসাবে আমি পূর্ণসংখ্যার ব্যবহার করেছি কারণ তারা স্যানিটাইজ করা সহজ।
  • সেটিংস এপিআই ব্যবহার করার সময় আপনার $ _POST, ননসেস, চেক_অ্যাডমিন_রেফারার (), আপডেট_পশন () ইত্যাদি দরকার নেই।
  • সংরক্ষণটি পরবর্তী পৃষ্ঠার লোডে ঘটে, শাটডাউনে নয়। তারপরে ডাব্লুপি আপনার পৃষ্ঠায় পুনর্নির্দেশ করে। সুতরাং ডিবাগ করতে, কিছু আউটপুট মুদ্রণ করতে এবং একটি বৈধকরণ কার্যক্রমে wp_die () কল করুন।
  • ফর্ম ক্রিয়া সর্বদা "অপশন.এফপি" হয়। সেটিংস এপিআই কাজ করে। অন্য কিছু ব্যবহার করবেন না। ঠিক আছে, আপনি চাইলে অ্যাডমিন_আরএল ('অপশনস.এফপি') ব্যবহার করতে পারেন।
  • ডাব্লুপি আপনার জন্য সংরক্ষণের বার্তাটি প্রিন্ট করবে।
  • এখানে উন্নতকরণ অন্তর্ভুক্ত নেই: <label>অ্যাক্সেসযোগ্যতার জন্য ব্যবহার করে। Add_settings_error (), সেটিংস_অরর () ব্যবহার করে, যা বার্তাগুলির পাশাপাশি ত্রুটিগুলিও পরিচালনা করে। প্রতিটি বিকল্পের জন্য পৃথক বৈধতা ফাংশন থাকার একমাত্র কারণ। আপনি নীচে যাচাই করুন_ডে (ও) দেখতে পারেন এবং বৈধতা (h) এক ফাংশন হতে পারে। আমি ম্যাসেজিংটি বিমূর্ত করার চেষ্টা করার দিকে তাকিয়েছিলাম, তবে আমার মনে পড়ার সাথে সাথে আপনি বৈধতা কলব্যাকের পর্যাপ্ত তথ্য পাবেন না। আপনি কোন ক্ষেত্রে কাজ করছেন তা পছন্দ করুন।
  • বৈধতা কলব্যাক ফাংশন সেটিংস API থেকে একটি কাঁচা $ _POST মান পান get আমি প্যারামিটারটির নামকরণ করতে চাই, কাঁচা। অ্যারে বিকল্পের জন্য, আপনি যাদু হিসাবে একটি অ্যারে পাবেন।
  • সম্পাদনা করুন: $ এটি এর থেকে & $ এর চেয়ে ভাল।

কোড:

<?php
$foo= new de_Foo();
class de_Foo {
function __construct() {
    if (is_admin()) {
        add_action('admin_menu', array($this, 'admin_menu'));
        add_action('admin_init', array($this, 'admin_init'));
    } 
}
public function admin_menu() {
    add_options_page(
       'DE Menu Options',
       'DE Menu',
       'manage_options',
       'de-menu-options',
       array($this,'xoxptions')
    );
    // add_option('de-menu-options', $this->options);
}
public function admin_init() {
 register_setting(
      'de-menu-settings-group',
      'de_w',
      array($this, 'validate_w')
 );
 register_setting(
      'de-menu-settings-group',
      'de_h',
      array($this, 'validate_h')
 );
 register_setting(
      'de-menu-settings-group',
      'de_width_height',
      array($this, 'validate_width_height')
 );
 add_settings_section(
      'de-menu-settings-section-size',
      'Size',
      array($this, 'settings_section_size_render'),
      'de-menu-options'
 );
 add_settings_field(
      'de_w',
      'W',
      array($this, 'w_render'),
      'de-menu-options',
      'de-menu-settings-section-size'
 );
 add_settings_field(
      'de_h',
      'H',
      array($this, 'h_render'),
      'de-menu-options',
      'de-menu-settings-section-size'
 );
 add_settings_field(
      'de_width_height',
      'Width / Height',
      array($this, 'width_height_render'),
      'de-menu-options',
      'de-menu-settings-section-size'
 );
}
public function options() {
    if (!current_user_can('manage_options')) {
        wp_die( __('You do not have sufficient permissions to access this page.') );
    }
////////////////////////////
// no no no
////////////////////////////
//         if ( !empty($_POST) && check_admin_referer('de-menu-options') ) {
//             // These options are saved to the database at shutdown
//             $this->options = array(
//                 "columns" => $_POST["de-menu-columns"],
//                 "maintenance" => $_POST["de-menu-maintenance"]
//             );
//             echo 'DE Menu options saved';
//         }
////////////////////////////
?>
<div class="wrap">
<h2>DE Menu Plugin</h2>
<form method="post" action="<?php echo admin_url('options.php'); ?>">
    <?php settings_fields('de-menu-settings-group'); ?>
    <?php do_settings_sections('de-menu-options'); ?>
    <p class="submit">
    <input type="submit" name="de-menu-submit" value="Update Options" />
    </p>
</form>
</div>
<?php
}
public function settings_section_size_render() {
    echo '<p>' . __('Main description of this section here.','de-menu-lang') . '</p>';
}
public function w_render() {
 $w= esc_attr( get_option('de_w') );
 echo "<p><input name='de_w' value='$w'></p>\n";
}
public function h_render() {
 $h= esc_attr( get_option('de_h') );
 echo "<p><input name='de_h' value='$h'></p>\n";
}
public function width_height_render() {
 $width_height= get_option('de_width_height', array());
 $width= esc_attr( @$width_height['width'] );
 $height= esc_attr( @$width_height['height'] );
 echo "<p>Width: <input name='de_width_height[width]' value='$width'></p>\n";
 echo "<p>Height: <input name='de_width_height[height]' value='$height'></p>\n";
}
function validate_w($raw) {
 return (int)$raw;
}
function validate_h($raw) {
 return (int)$raw;
}
function validate_width_height($raw) {
 is_array($raw) or $raw= array();
 $result= array();
 $result['width']= (int)@$raw['width'];
 $result['height']= (int)@$raw['height'];
 return $result;
}
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.