2012-06-29 4 views
1

Я перекрестно размещаю это из раздела wordpress, b/c. Я думаю, что проблема кроется в моем недостаточном понимании ООП, так что, возможно, это должно было быть опубликовано здесь в первое место.несколько экземпляров класса в плагине wordpress

При написании плагинов Wordpress я хотел создать класс, который я мог бы использовать в каждом плагине, чтобы заботиться о мирском создании страницы параметров плагина: так что добавьте страницу меню, настройки белого списка, выплюньте и подтвердите параметры и т. Д. Я думал в основном, я хотел бы использовать что-то, что мне нужно, чтобы написать класс.

В самой своей базе я ожидал, что я могу сказать новые KIA_Plugin_Options ($ args) в обоих плагинах один и два (с разными $ args) и каждый из них будет проверять страницы опций для своих соответствующих плагинов. однако я добавил следующий класс в 2 плагина, и вместо создания меню для каждого из них он обрабатывает только 1, а затем умирает. поэтому часть его работы, но не является повторно используемой панацеей, к которой я еще собирался, поэтому я чувствую, что упускаю какую-то важную концепцию в ООП.

вот скелет моего класса параметров:

<?php 

class KIA_Plugin_Options { 

    private $page_title; 
    private $menu_title; 
    private $capability; 
    private $menu_slug; 
    private $setting_name; 
    private $option_name; 

    function KIA_Plugin_Options($args){ 

    //convert $args to array 
    if(!is_array($args)) $args['page_title'] = $args; 

    if(!isset($args['page_title'])) die (__('Plugin Options needs at least the plugin\'s page title parameter.','kia_plugin_options')); 

    // Define the class variables 
    $this->page_title = $args['page_title']; 
    $this->menu_title = isset($args['menu_title']) ? $args['menu_title'] : $this->page_title; 
    $this->capability = isset($args['capability']) ? $args['capability'] : 'manage_options'; 
    $this->menu_slug = isset($args['menu_slug']) ? $args['menu_slug'] : sanitize_title_with_dashes($this->menu_title); 
    $this->setting_name = isset($args['setting_name']) ? $args['setting_name'] : $this->menu_slug; 
    $this->option_name = isset($args['option_name']) ? $args['option_name'] : $this->menu_slug; 

    // Set-up Action and Filter Hooks 
    register_activation_hook(__FILE__, array(&$this,'add_defaults_options')); 
    register_uninstall_hook(__FILE__, array(&$this,'delete_plugin_options')); 

    //add settings page 
    add_action('admin_init', array(&$this,'register_settings')); 
    add_action('admin_menu', array(&$this,'add_options_page')); 

    //add settings link to plugins page 
    add_filter('plugin_action_links', array(&$this,'add_action_links'), 10, 2); 
    } 


    // ------------------------------------------------------------------------------ 
    // CALLBACK FUNCTION FOR: register_activation_hook(__FILE__, 'add_defaults_options') 
    // ------------------------------------------------------------------------------ 

    // Define default option settings 
    function add_defaults_options() { 
    if(get_option('kia_tell_a_friend_options')) return false; 

    $defaults = array( 
       "emailsubject" => __('I saw this and thought of you!', 'kia_tell_a_friend'), 
       "emailmsg" => __('I just saw this!', 'kia_tell_a_friend'), 
       "twittermsg" => __('Check this out!', 'kia_tell_a_friend') 
    ); 
    update_option('kia_tell_a_friend_options', $defaults); 
    } 


    // -------------------------------------------------------------------------------------- 
    // CALLBACK FUNCTION FOR: register_uninstall_hook(__FILE__, 'delete_plugin_options') 
    // -------------------------------------------------------------------------------------- 

    // Delete options table entries ONLY when plugin deactivated AND deleted 
    function delete_plugin_options() { 
    $options = get_option('kia_tell_a_friend_options', true); 
    if(isset($options['delete'])) delete_option('kia_tell_a_friend_options'); 
    } 


    // ------------------------------------------------------------------------------ 
    // CALLBACK FUNCTION FOR: add_action('admin_init', array(&$this,'register_settings')); 
    // ------------------------------------------------------------------------------ 

    // Init plugin options to white list our options 
    function register_settings(){ 
    register_setting($this->setting_name, $this->option_name, array(&$this,'validate_options')); 
    } 

    // ------------------------------------------------------------------------------ 
    // CALLBACK FUNCTION FOR: add_action('admin_menu', array(&$this,'add_options_page')); 
    // ------------------------------------------------------------------------------ 

    // Add menu page 
    function add_options_page() { 
    $page = add_options_page($this->page_title , $this->menu_title, $this->capability, $this->menu_slug, array(&$this,'render_form')); 

    /* Using registered $page handle to hook stylesheet loading */ 
    add_action('admin_print_styles-' . $page, array(&$this,'admin_style')); 
    } 

    // ------------------------------------------------------------------------------ 
    // CALLBACK FUNCTION FOR: add_action('admin_print_styles-' . $page, array(&$this,'admin_styles')); 
    // ------------------------------------------------------------------------------ 

    // Add menu page styles 
    function admin_style() { 
    wp_enqueue_style('plugin-options',plugins_url('css/options-framework.css', __FILE__)); 
    } 


    // ------------------------------------------------------------------------------ 
    // CALLBACK FUNCTION SPECIFIED IN: add_options_page() 
    // ------------------------------------------------------------------------------ 

    // Render the Plugin options form 
    function render_form() { 
    echo "Bacon!!!"; 
    } 

    // Sanitize and validate input. Accepts an array, return a sanitized array. 
    function validate_options($input) { 

    $clean = array(); 

    // strip html from textboxes 
    $clean['pubid'] = wp_filter_nohtml_kses($input['pubid']); // Sanitize text input (strip html tags, and escape characters) 
    $clean['delete'] = isset($input['delete']) ? 'true' : 'false' ; //checkbox 

    $clean['emailsubject'] = wp_filter_nohtml_kses($input['emailsubject']); // Sanitize text input (strip html tags, and escape characters) 
    $clean['emailmsg'] = wp_filter_post_kses($input['emailmsg']); // Sanitize textbox input (allow tags that area allowed in posts) 

    $clean['twittermsg'] = wp_filter_nohtml_kses($input['twittermsg']); // Sanitize text input (strip html tags, and escape characters) 

    return $clean; 
    } 

    // Display a Settings link on the main Plugins page 
    function add_action_links($links, $file) { 

    if ($file == plugin_basename(__FILE__)) { 
     $posk_links = '<a href="'.admin_url('options-general.php?page=tell-a-friend').'">'.__('Settings', 'kia_tell_a_friend').'</a>'; 
     // make the 'Settings' link appear first 
     array_unshift($links, $posk_links); 
    } 

    return $links; 
    } 


} 

затем в мой первый плагин я звоню (на инициализации крюком)

$args = array ('page_title' => 'apple options page', 
         'menu_title' => 'apple options', 
         'capability' => 'manage_options', 
         'menu_slug' => 'apple_options', 
         'setting_name' => 'apple_settings', 
         'option_name' => 'apple_db_options'); 

    $this->options = new KIA_Plugin_Options($args); 

и на второй плагин

$args = array ('page_title' => 'bacon options page', 
        'menu_title' => 'bacon options', 
        'capability' => 'manage_options', 
        'menu_slug' => 'bacon_options', 
        'setting_name' => 'bacon_settings', 
        'option_name' => 'bacon_db_options'); 

$this->options = new KIA_Plugin_Options($args); 

оба плагина содержатся в своих собственных классах. я могу опубликовать один из манекенов, если это поможет, но у него было много кода.

ответ

1

Из собственного опыта я могу сказать, что можно разделить классы базы как таковые с PHP, однако имейте в виду, что Wordpress сам по себе не является объектно-ориентированным.

Поэтому, когда вы регистрируете крючки, страницы, обратные вызовы и т. Д., Позаботьтесь о том, чтобы вы и wordpress могли легко различать.

Например, в базовом классе вашего плагина вы используете __FILE__ для регистрации крючков. Это значение одинаково во всех случаях, поэтому не полезно. Также для некоторых крючков вам нужно другое значение. Поэтому, возможно, сначала начните с чего-то более легкого, например. без процедур активации/удаления и заставить его работать. Всего две страницы в администраторе, их записи в меню и т. Д. Шаг за шагом.

Затем ознакомьтесь с плагином NavXT Breadcrumb. Он делает что-то подобное, у него есть базовый класс AdminKit, из которого выходит конкретная страница параметров. Я лично не буду говорить, что это идеально, но это может быть интересно для вас читать:

Кроме того, я предлагаю вам не только ключ все в базовый класс, но что вы еще создать объекты, как вам нужно, чтобы держать вещи более обособленно и гибким:

Надеюсь, что это поможет немного вернуть работу.

+0

эй спасибо за советы!Я думал, что снимаю его с того, что я на самом деле хочу сделать, но вы, вероятно, правы, что мне нужно идти еще проще, а затем наращивать, когда я выясню, что происходит на w/oop. у меня был друг, который посмотрел, и она, по-видимому, не в состоянии воспроизвести мою проблему, поэтому я не знаю, что происходит. Я ценю ссылки, я буду читать их утром. – helgatheviking

Смежные вопросы