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