একটি ওওপি প্লাগইনের জন্য সেটিংস পৃষ্ঠা জমা দেওয়ার ক্ষেত্রে "ত্রুটি: বিকল্প পৃষ্ঠা পাওয়া যায় নি"


19

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

নীচে আমি ব্যবহার করছি সাধারণ কোড সেটআপ ...

ফর্ম (/ ভিউস / অ্যাডমিন.এফপি):

<div class="wrap">
    <h2><?php echo esc_html( get_admin_page_title() ); ?></h2>
    <form action="options.php" method="post">
        <?php
        settings_fields( $this->plugin_slug );
        do_settings_sections( $this->plugin_slug );
        submit_button( 'Save Settings' );
        ?>
    </form>
</div>

নিম্নলিখিত কোডের জন্য, add_settings_field () এবং অ্যাড_সেটিংস_সেকশন () অস্তিত্বের জন্য সমস্ত কলব্যাকগুলি ধরে নিন, 'বিকল্প-তালিকা_ছন্দ' বাদে।

প্লাগিন অ্যাডমিন ক্লাস (/ {প্লাগইন_নাম} -ক্লাস-অ্যাডমিন.পিপি):

namespace wp_plugin_name;

class Plugin_Name_Admin
{
    /**
     * Note: Some portions of the class code and method functions are missing for brevity
     * Let me know if you need more information...
     */

    private function __construct()
    {
        $plugin              = Plugin_Name::get_instance();

        $this->plugin_slug   = $plugin->get_plugin_slug();
        $this->friendly_name = $plugin->get_name(); // Get "Human Friendly" presentable name

        // Adds all of the options for the administrative settings
        add_action( 'admin_init', array( $this, 'plugin_options_init' ) );

        // Add the options page and menu item
        add_action( 'admin_menu', array( $this, 'add_plugin_admin_menu' ) );


    }

    public function add_plugin_admin_menu()
    {

        // Add an Options Page
        $this->plugin_screen_hook_suffix =
        add_options_page(
            __( $this->friendly_name . " Options", $this->plugin_slug ),
            __( $this->friendly_name, $this->plugin_slug ),
            "manage_options", 
            $this->plugin_slug,
            array( $this, "display_plugin_admin_page" )
        );

    }

    public function display_plugin_admin_page()
    {
        include_once( 'views/admin.php' );
    }

    public function plugin_options_init()
    {
        // Update Settings
        add_settings_section(
            'maintenance',
            'Maintenance',
            array( $this, 'maintenance_section' ),
            $this->plugin_slug
        );

        // Check Updates Option
        register_setting( 
            'maintenance',
            'plugin-name_check_updates',
            'wp_plugin_name\validate_bool'
        );

        add_settings_field(
            'check_updates',
            'Should ' . $this->friendly_name . ' Check For Updates?',
            array( $this, 'check_updates_field' ),
            $this->plugin_slug,
            'maintenance'
        );

        // Update Period Option
        register_setting(
            'maintenance',
            'plugin-name_update_period',
            'wp_plugin_name\validate_int'
        );

        add_settings_field(
            'update_frequency',
            'How Often Should ' . $this->friendly_name . ' Check for Updates?',
            array( $this, 'update_frequency_field' ),
            $this->plugin_slug,
            'maintenance'
        );

        // Plugin Option Configurations
        add_settings_section(
            'category-option-list', 'Widget Options List',
            array( $this, 'option_list_section' ),
            $this->plugin_slug
        );
    }
}

কিছু অনুরোধ আপডেট:

ক্রিয়া বৈশিষ্ট্য এতে পরিবর্তন করা হচ্ছে:

<form action="../../options.php" method="post">

... কেবল একটি 404 ত্রুটির ফলাফল। নীচে অ্যাপাচি লগসের উদ্ধৃতিটি দেওয়া হল is নোট করুন যে ডিফল্ট ওয়ার্ডপ্রেস স্ক্রিপ্ট এবং সিএসএস এন-সারিগুলি সরানো হয়েছে:

# Changed to ../../options.php
127.0.0.1 - - [01/Apr/2014:15:59:43 -0400] "GET /wp-admin/options-general.php?page=pluginname-widget HTTP/1.1" 200 18525
127.0.0.1 - - [01/Apr/2014:15:59:43 -0400] "GET /wp-content/plugins/PluginName/admin/assets/css/admin.css?ver=0.1.1 HTTP/1.1" 304 -
127.0.0.1 - - [01/Apr/2014:15:59:43 -0400] "GET /wp-content/plugins/PluginName/admin/assets/js/admin.js?ver=0.1.1 HTTP/1.1" 304 -
127.0.0.1 - - [01/Apr/2014:15:59:52 -0400] "POST /options.php HTTP/1.1" 404 1305
127.0.0.1 - - [01/Apr/2014:16:00:32 -0400] "POST /options.php HTTP/1.1" 404 1305

#Changed to options.php
127.0.0.1 - - [01/Apr/2014:16:00:35 -0400] "GET /wp-admin/options-general.php?page=pluginname-widget HTTP/1.1" 200 18519
127.0.0.1 - - [01/Apr/2014:16:00:35 -0400] "GET /wp-content/plugins/PluginName/admin/assets/css/admin.css?ver=0.1.1 HTTP/1.1" 304 -
127.0.0.1 - - [01/Apr/2014:16:00:35 -0400] "GET /wp-content/plugins/PluginName/admin/assets/js/admin.js?ver=0.1.1 HTTP/1.1" 304 -
127.0.0.1 - - [01/Apr/2014:16:00:38 -0400] "POST /wp-admin/options.php HTTP/1.1" 500 2958

পিএইচপি-ত্রুটি.লগ ফাইল এবং ডিবাগ.লগ ফাইল উভয়ই যখন ডাব্লুপিডিডিইউবিজি সত্য হয় তবে খালি থাকে।

প্লাগিন শ্রেণি (/{প্লাগিন-নাম}- শ্রেণি.এফপি)

namespace wp_plugin_name;

class Plugin_Name
{
    const VERSION = '1.1.2';
    const TABLE_VERSION = 1;
    const CHECK_UPDATE_DEFAULT = 1;
    const UPDATE_PERIOD_DEFAULT = 604800;

    protected $plugin_slug = 'pluginname-widget';
    protected $friendly_name = 'PluginName Widget';

    protected static $instance = null;

    private function __construct()
    {

        // Load plugin text domain
        add_action( 'init',
                    array(
            $this,
            'load_plugin_textdomain' ) );

        // Activate plugin when new blog is added
        add_action( 'wpmu_new_blog',
                    array(
            $this,
            'activate_new_site' ) );

        // Load public-facing style sheet and JavaScript.
        add_action( 'wp_enqueue_scripts',
                    array(
            $this,
            'enqueue_styles' ) );
        add_action( 'wp_enqueue_scripts',
                    array(
            $this,
            'enqueue_scripts' ) );

        /* Define custom functionality.
         * Refer To http://codex.wordpress.org/Plugin_API#Hooks.2C_Actions_and_Filters
         */

    }

    public function get_plugin_slug()
    {
        return $this->plugin_slug;
    }

    public function get_name()
    {
        return $this->friendly_name;
    }

    public static function get_instance()
    {

        // If the single instance hasn't been set, set it now.
        if ( null == self::$instance )
        {
            self::$instance = new self;
        }

        return self::$instance;

    }

    /**
     * The member functions activate(), deactivate(), and update() are very similar.
     * See the Boilerplate plugin for more details...
     *
     */

    private static function single_activate()
    {
        if ( !current_user_can( 'activate_plugins' ) )
            return;

        $plugin_request = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';

        check_admin_referer( "activate-plugin_$plugin_request" );

        /**
         *  Test to see if this is a fresh installation
         */
        if ( get_option( 'plugin-name_version' ) === false )
        {
            // Get the time as a Unix Timestamp, and add one week
            $unix_time_utc = time() + Plugin_Name::UPDATE_PERIOD_DEFAULT;

            add_option( 'plugin-name_version', Plugin_Name::VERSION );
            add_option( 'plugin-name_check_updates',
                        Plugin_Name::CHECK_UPDATE_DEFAULT );
            add_option( 'plugin-name_update_frequency',
                        Plugin_Name::UPDATE_PERIOD_DEFAULT );
            add_option( 'plugin-name_next_check', $unix_time_utc );

            // Create options table
            table_update();

            // Let user know PluginName was installed successfully
            is_admin() && add_filter( 'gettext', 'finalization_message', 99, 3 );
        }
        else
        {
            // Let user know PluginName was activated successfully
            is_admin() && add_filter( 'gettext', 'activate_message', 99, 3 );
        }

    }

    private static function single_update()
    {
        if ( !current_user_can( 'activate_plugins' ) )
            return;

        $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';

        check_admin_referer( "activate-plugin_{$plugin}" );

        $cache_plugin_version         = get_option( 'plugin-name_version' );
        $cache_table_version          = get_option( 'plugin-name_table_version' );
        $cache_deferred_admin_notices = get_option( 'plugin-name_admin_messages',
                                                    array() );

        /**
         * Find out what version of our plugin we're running and compare it to our
         * defined version here
         */
        if ( $cache_plugin_version > self::VERSION )
        {
            $cache_deferred_admin_notices[] = array(
                'error',
                "You seem to be attempting to revert to an older version of " . $this->get_name() . ". Reverting via the update feature is not supported."
            );
        }
        else if ( $cache_plugin_version === self::VERSION )
        {
            $cache_deferred_admin_notices[] = array(
                'updated',
                "You're already using the latest version of " . $this->get_name() . "!"
            );
            return;
        }

        /**
         * If we can't determine what version the table is at, update it...
         */
        if ( !is_int( $cache_table_version ) )
        {
            update_option( 'plugin-name_table_version', TABLE_VERSION );
            table_update();
        }

        /**
         * Otherwise, we'll just check if there's a needed update
         */
        else if ( $cache_table_version < TABLE_VERSION )
        {
            table_update();
        }

        /**
         * The table didn't need updating.
         * Note we cannot update any other options because we cannot assume they are still
         * the defaults for our plugin... ( unless we stored them in the db )
         */

    }

    private static function single_deactivate()
    {

        // Determine if the current user has the proper permissions
        if ( !current_user_can( 'activate_plugins' ) )
            return;

        // Is there any request data?
        $plugin = isset( $_REQUEST['plugin'] ) ? $_REQUEST['plugin'] : '';

        // Check if the nonce was valid
        check_admin_referer( "deactivate-plugin_{$plugin}" );

        // We'll, technically the plugin isn't included when deactivated so...
        // Do nothing

    }

    public function load_plugin_textdomain()
    {

        $domain = $this->plugin_slug;
        $locale = apply_filters( 'plugin_locale', get_locale(), $domain );

        load_textdomain( $domain,
                         trailingslashit( WP_LANG_DIR ) . $domain . '/' . $domain . '-' . $locale . '.mo' );
        load_plugin_textdomain( $domain, FALSE,
                                basename( plugin_dir_path( dirname( __FILE__ ) ) ) . '/languages/' );

    }

    public function activate_message( $translated_text, $untranslated_text,
                                      $domain )
    {
        $old = "Plugin <strong>activated</strong>.";
        $new = FRIENDLY_NAME . " was  <strong>successfully activated</strong> ";

        if ( $untranslated_text === $old )
            $translated_text = $new;

        return $translated_text;

    }

    public function finalization_message( $translated_text, $untranslated_text,
                                          $domain )
    {
        $old = "Plugin <strong>activated</strong>.";
        $new = "Captain, The Core is stable and PluginName was <strong>successfully installed</strong> and ready for Warp speed";

        if ( $untranslated_text === $old )
            $translated_text = $new;

        return $translated_text;

    }

}

তথ্যসূত্র:


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

1
আপনার কোড পরীক্ষা করার পরে ../../options.php ব্যবহার করুন।
রবি প্যাটেল

আপনি কি দয়া করে get_plugin_slug () দেখাতে পারেন।
ভ্যানকোডার

@ ভ্যাঙ্কোডার আমি প্রাসঙ্গিক তথ্যের সাথে উপরের পোস্টটি সম্পাদনা করেছি ...
গেট_জিনিজার

আপনার রেজিস্ট্রেশন_সেটিংগুলিতে কেন আপনার স্যানিটাইজেশন কলব্যাকগুলিতে ব্যাকস্ল্যাশ রয়েছে? আমি মনে করি না যে এটি কাজ করবে।
বিয়ন্সের

উত্তর:


21

"ত্রুটি: বিকল্প পৃষ্ঠা পাওয়া যায় নি" বাগ

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

"ত্রুটি: বিকল্প পৃষ্ঠা পাওয়া যায় নি।" সমস্যা (একটি সমাধান এবং ব্যাখ্যা সহ):

সমস্যাটি হ'ল 'হোয়াইটলিস্ট_পশন' ফিল্টারটি আপনার ডেটার জন্য সঠিক সূচকটি পায় নি। এটি অপশনগুলিতে প্রয়োগ হয়। # 98 (ডাব্লুপি 3.4)।

register_settings()বিশ্বব্যাপী আপনার ডেটা যুক্ত করে $new_whitelist_options। এই তারপর বিশ্বব্যাপী সঙ্গে মিশে গিয়ে পরার $whitelist_optionsভিতরে option_update_filter()(রেস্প। add_option_whitelist()) কলব্যাক (গুলি)। সেই কলব্যাকগুলি সূচক হিসাবে আপনার ডেটা বিশ্বব্যাপী $new_whitelist_optionsযুক্ত করে $option_group। যখন আপনার মুখোমুখি হয় "ত্রুটি: বিকল্প পৃষ্ঠাটি পাওয়া যায় নি।" এর অর্থ আপনার সূচকটি স্বীকৃত হয়নি। বিভ্রান্তিকর জিনিস যে প্রথম আর্গুমেন্ট সূচক হিসাবে ব্যবহার করা হয় এবং এর নামকরণ করা হয় $options_group, যখন options.php প্রকৃত চেক # 112 বিরুদ্ধে ঘটে $options_page, যা $hook_suffix, যা আপনার কাছ থেকে @return মান হিসাবে পেতে add_submenu_page()

সংক্ষেপে, একটি সহজ সমাধান হল $option_groupম্যাচ তৈরি করা $option_name। এই ত্রুটির জন্য আর একটি কারণ $pageপ্যারামিটারের জন্য একটি অবৈধ মান হ'ল হয় add_settings_section( $id, $title, $callback, $page )বা যখন কল করা হয় add_settings_field( $id, $title, $callback, $page, $section, $args )

ইঙ্গিত: ফাংশন উল্লেখ থেকে থিম পৃষ্ঠা যুক্ত করা $pageউচিত $menu_slug

সিম্পল ফিক্স

$this->plugin_slugআপনার বিভাগের আইডি হিসাবে কাস্টম পৃষ্ঠার নামটি (আপনার ক্ষেত্রে :) ব্যবহার করা সমস্যার সমাধান করবে। তবে, আপনার সমস্ত অপশন একটি একক বিভাগে থাকতে হবে।

সমাধান

আরও শক্তিশালী সমাধানের জন্য, আপনার Plugin_Name_Adminশ্রেণিতে এই পরিবর্তনগুলি করুন :

নির্মাণকারীর সাথে যুক্ত করুন:

// Tracks new sections for whitelist_custom_options_page()
$this->page_sections = array();
// Must run after wp's `option_update_filter()`, so priority > 10
add_action( 'whitelist_options', array( $this, 'whitelist_custom_options_page' ),11 );

এই পদ্ধতিগুলি যুক্ত করুন:

// White-lists options on custom pages.
// Workaround for second issue: http://j.mp/Pk3UCF
public function whitelist_custom_options_page( $whitelist_options ){
    // Custom options are mapped by section id; Re-map by page slug.
    foreach($this->page_sections as $page => $sections ){
        $whitelist_options[$page] = array();
        foreach( $sections as $section )
            if( !empty( $whitelist_options[$section] ) )
                foreach( $whitelist_options[$section] as $option )
                    $whitelist_options[$page][] = $option;
            }
    return $whitelist_options;
}

// Wrapper for wp's `add_settings_section()` that tracks custom sections
private function add_settings_section( $id, $title, $cb, $page ){
    add_settings_section( $id, $title, $cb, $page );
    if( $id != $page ){
        if( !isset($this->page_sections[$page]))
            $this->page_sections[$page] = array();
        $this->page_sections[$page][$id] = $id;
    }
}

আর পরিবর্তন add_settings_section()কল: $this->add_settings_section()


আপনার কোডে অন্যান্য নোট

  • আপনার ফর্ম কোডটি সঠিক। আপনার ফর্মটি @Cris_O দ্বারা আমাকে নির্দেশিত হিসাবে এবং ডাব্লুপি সেটিংস এপিআই ডকুমেন্টেশনে উল্লিখিত হিসাবে বিকল্পগুলি.পিএফপিতে জমা দিতে হবে ।
  • নেমস্পেসিং এর সুবিধাগুলি রয়েছে তবে এটি ডিবাগ করা আরও জটিল করে তুলতে পারে এবং আপনার কোডের সামঞ্জস্যতা কমিয়ে দেয় (পিএইচপি> = 5.3, অন্যান্য প্লাগইন / থিম যা অটোলোডার ব্যবহার করে ইত্যাদি)) সুতরাং যদি আপনার ফাইলটির নাম স্থান দেওয়ার কোনও ভাল কারণ না থাকে তবে তা করবেন না। আপনি ইতিমধ্যে একটি ক্লাসে আপনার কোড মোড়ানো দ্বারা বিরোধের নামকরণ এড়াচ্ছেন। আপনার শ্রেণীর নামগুলি আরও নির্দিষ্ট করুন এবং আপনার validate()কলব্যাকগুলি সর্বজনীন পদ্ধতি হিসাবে শ্রেণিতে আনুন the
  • আপনার কোডের সাথে আপনার উদ্ধৃত প্লাগইন বয়লারপ্লেটের তুলনা করে দেখে মনে হচ্ছে আপনার কোডটি আসলে কাঁটাচামচ বা বয়লারপ্লেটের একটি পুরানো সংস্করণে ভিত্তি করে। এমনকি ফাইলের নাম এবং পথও আলাদা। আপনি আপনার প্লাগইনটি সর্বশেষতম সংস্করণে স্থানান্তর করতে পারেন তবে নোট করুন যে এই প্লাগইনটি বয়লারপ্লেট আপনার প্রয়োজনের জন্য সঠিক নাও হতে পারে। এটি সিঙ্গলটনের ব্যবহার করে, যা সাধারণত নিরুৎসাহিত হয় । এমন কিছু ক্ষেত্রে রয়েছে যেখানে সিঙ্গলটন প্যাটার্নটি বুদ্ধিমান , তবে এটি সচেতন সিদ্ধান্ত হওয়া উচিত, গোটো সমাধান নয়।

1
এপিআই-তে একটি বাগ আছে তা জেনে ভাল লাগল। আমি যে কোডগুলি প্রবর্তন করতে পারি তার জন্য আমি যে কোডটি লিখি তা সর্বদা চেষ্টা করার চেষ্টা করি। অবশ্যই, এটি ধরে নিয়েছে আমি একটি বা দুটি জিনিস জানি।
গেট_জিনিজার 21

এই সমস্যাটি যে কেউ আসছেন তাদের জন্য: কোডেক্সে ওওপি
ক্রিয়েটিং_অপশন_পেনগুলি#

5

একই সমস্যাটি সন্ধান করতে গিয়ে আমি এই পোস্টটি সন্ধান করেছি। সমাধানটি দেখতে যত সহজ লাগে তার থেকে সহজ কারণ ডকুমেন্টেশনগুলি বিভ্রান্তিমূলক: রেজিস্টার_সেটিংয়ে () নামটির প্রথম যুক্তিটি $option_groupহল আপনার পৃষ্ঠা স্লাগ, আপনি যে বিভাগে সেটিংসটি প্রদর্শন করতে চান তা নয়।

উপরের কোডটিতে আপনার ব্যবহার করা উচিত

    // Update Settings
    add_settings_section(
        'maintenance', // section slug
        'Maintenance', // section title
        array( $this, 'maintenance_section' ), // section display callback
        $this->plugin_slug // page slug
    );

    // Check Updates Option
    register_setting( 
        $this->plugin_slug, // page slug, not the section slug
        'plugin-name_check_updates', // setting slug
        'wp_plugin_name\validate_bool' // invalid, should be an array of options, see doc for more info
    );

    add_settings_field(
        'plugin-name_check_updates', // setting slug
        'Should ' . $this->friendly_name . ' Check For Updates?', // setting title
        array( $this, 'check_updates_field' ), //setting display callback
        $this->plugin_slug, // page slug
        'maintenance' // section slug
    );

এটি সঠিক নয়। দয়া করে এই কাজের উদাহরণটি দেখুন (আমার নয়) - gist.github.com/annalinneajohansson/5290405
Xdg

2

এর সাথে বিকল্প পৃষ্ঠা নিবন্ধন করার সময়:

add_submenu_page( string $parent_slug, string $page_title, string $menu_title, string $capability, string $menu_slug, callable $function = '' )

এবং সাথে সেটিংস নিবন্ধকরণ

register_setting( string $option_group, string $option_name );

$option_group হিসাবে একই হতে হবে $menu_slug


1

আমার একই ত্রুটি ছিল তবে এটি অন্যভাবে পেয়েছি:

// no actual code
// this failed
add_settings_field('id','title', /*callback*/ function($arguments) {
    // echo $htmlcode; 
    register_setting('option_group', 'option_name');
}), 'page', 'section');

আমি জানি না কেন এটি ঘটেছে, তবে মনে হচ্ছে register_settingএটি কলব্যাকের মধ্যে থাকা উচিত নয়add_settings_field

// no actual code
// this worked
add_settings_field('id','title', /*callback*/ function($arguments) {echo $htmlcode;}), 'page', 'section');
register_setting('option_group', 'option_name');

আশা করি এটা কাজে লাগবে


0

আমি বেশ কয়েকদিন ধরে এই সমস্যার মুখোমুখি হয়েছি, আমি মন্তব্যটির লাইনটি দেওয়ার সময় এই ত্রুটিটি থেমেছিল:

// settings_fields($this->plugin_slug);

তারপরে আমি অপশন.এফপি-তে পুনঃনির্দেশ করছি তবে আমি setting_fieldsএখনও সমস্যার সমাধান করতে পারি না ।


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