php - WordPress 插件中一个类的多个实例

标签 php oop wordpress

我是从 wordpress 部分交叉发布的,b/c 我认为问题更多在于我对 OOP 缺乏了解,所以也许它应该首先发布在这里。

在编写 WordPress 插件时,我想创建一个可以在每个插件中使用的类,以处理插件选项页面的日常创建:因此添加菜单页面、白名单设置、吐出和验证选项等。我想基本上,我想重用一些我必须需要编写一个类的东西。

从根本上讲,我期望我可以在插件一和插件二(具有不同的 $args)中说 new KIA_Plugin_Options($args) ,并且每个插件都会为各自的插件创建选项页面。但是,我在 2 个插件中添加了以下类,而不是为每个插件创建菜单,它只处理 1 个插件,然后就死掉了。所以它的一部分是有效的,但还不是我想要的可重复使用的 Elixir ,所以我觉得我错过了 OOP 中的一些重要概念。

这是我的选项类的框架:

<?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;
  }


}

然后在我的第一个插件中调用(在 init Hook 上)

$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 );

这两个插件都包含在各自的类中。如果有帮助的话,我可以发布其中一个假人,但是代码会很多。

最佳答案

根据我自己的经验,我可以说可以与 PHP 共享基类本身,但是请记住,Wordpress 本身不是面向对象的。

所以当你注册钩子(Hook)、页面、回调之类的时候,要注意你和wordpress本身可以很容易区分。

例如,在插件的基类中,您使用 __FILE__ 来注册 Hook 。该值在所有情况下都是相同的,因此没有用。另外,对于某些钩子(Hook),您还需要一些其他值。因此,也许首先从更轻量级的东西开始,例如无需激活/卸载例程并使其正常工作。管理中只有两个页面,他们的菜单条目等。一步一步。

然后查看 Breadcrumb NavXT 插件。它做了类似的事情,它有一个 AdminKi​​t 基类,具体选项页面从中扩展。我个人不会说它是完美的,但您可能会感兴趣:

此外,我建议您不仅将所有内容都整合到基类中,而且还可以根据需要创建对象,以使事物更加分离和灵活:

希望这有助于让事情恢复正常。

关于php - WordPress 插件中一个类的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11267657/

相关文章:

php - WooCommerce Rest API 返回 404 未找到

php - AMQP - 连接超时

php - 拉维尔 5.7 : Cleanest way to generate nested urls in views

使用汇总数据查询一组类对象的 PHP 最佳实践

wordpress - 从外部插件编辑 wp-config.php

php - 当成员(member)订阅到期时,WordPress 用户的角色设置为 "no role for this site"

php - 使用 PHP 在浏览器中打开 PDF

javascript - Codeigniter - 当选择客户并向他们显示信息时

oop - Python:将实例方法动态分配为实例属性有什么问题

oop - UML 类图中的关系如何继承?