Where to add hooks in a class

时间:2016-02-17 作者:j8d

在下面的代码中,底部两个函数下的钩子不应该放在构造函数中吗?

class The_Class {
    private static $instance = null;

    public static function get_instance() {
        return null == self::$instance ? self::$instance = new self : self::$instance;
    }

    function __construct() {
        if ( is_admin() ) {
            add_filter( \'wp_edit_nav_menu_walker\', array( &$this, \'edit_nav_menu_walker\' ) );
            add_filter( \'wp_nav_menu_item_custom_fields\', array( &$this, \'option\' ), 12, 2 );
            add_action( \'wp_update_nav_menu_item\', array( &$this, \'update_option_text\' ), 10, 3 );
            add_action( \'wp_update_nav_menu_item\', array( &$this, \'update_option_hide_show\' ), 10, 3 );
            add_action( \'delete_post\', array( &$this, \'remove_visibility_meta\' ), 1, 3 );
        } else {
            add_filter( \'wp_get_nav_menu_items\', array( &$this, \'set_visibility\' ), 10, 3 );
            add_action( \'init\', array( &$this, \'clear_gantry_menu_cache\' ) );
        }
    }

    function deactivate_other_lsmi() {
        if ( is_plugin_active( \'lsmi-by-city/LSMI_City.php\' ) ) {
            deactivate_plugins( \'lsmi-by-city/LSMI_City.php\' );
        }
    }

add_action( \'admin_init\', array( &$this, \'deactivate_other_lsmi\' ) );

    function lsmi_load_admin_script() {
        wp_register_style( \'chosencss\', plugins_url( \'assets/chosen.css\', __FILE__ ), true, \'\', \'all\' );
        wp_register_script( \'chosenjs\', plugins_url( \'assets/chosen.jquery.js\', __FILE__ ), array( \'jquery\' ), \'\', true );
        wp_enqueue_style( \'chosencss\' );
        wp_enqueue_script( \'chosenjs\' );
    }

add_action( \'admin_enqueue_scripts\', array( &$this, \'lsmi_load_admin_script\' ) );

}

1 个回复
最合适的回答,由SO网友:Nathan Johnson 整理而成

在类中的何处添加挂钩?

在基于类的面向对象编程中,构造函数(缩写为ctor)是一种特殊类型的子例程,用于创建对象。它准备新对象以供使用,通常接受构造函数用来设置所需成员变量的参数资料来源:Wikipedia.

构造函数不是添加操作和筛选器的地方。

在下面的代码中,底部两个函数下的钩子不应该放在构造函数中吗?

上述代码无效,在您尝试运行时将引发错误。底部两个函数下的钩子需要放在方法中,但不一定是构造函数。

使用上面的代码,我会改变很多事情。

首先,这门课做的一件事是什么?无法回答,因为它做了不止一件事。它添加挂钩,将样式和脚本排队,并停用插件。这表明它应该被分成更多的类别。

其次,我从不使用单例模式。看见here 为什么。

第三,没有理由;在$这个之前。这是PHP 4的遗留问题。PHP中的所有对象(WordPress支持)现在都是通过引用传递的,所以没有理由这样做。这实际上不会引起任何副作用,只是一种代码气味。

功能。php

//* Start bootstrapping the plugin
require __DIR__ . \'/bootstrap.php\';
require __DIR__ . \'/plugin.php\';

//* Use the plugins_loaded at priority 0 to finish bootstrapping
$plugin = new plugin();
add_action( \'plugins_loaded\', [ new bootstrap( $plugin ), \'plugins_loaded\' ], 0 );
引导。php

class bootstrap() {
  public $plugin;
  public function __constructor( $plugin ) {
    $this->plugin = $plugin;
  }
  public function plugins_loaded() {
    array_map( function( $hook ) {
      method_exists( $this->plugin, $hook ) && add_action( $hook, [ $this->plugin, $hook ] );
    }, [ \'plugins_loaded\', \'after_setup_theme\', \'init\', \'admin_init\', \'wp\' ] );
  }
}
插件。php

class plugin() {
  public function plugins_loaded() {
    //* Maybe you want to require more files here
    add_action( \'init\', [ $this, \'public_init\' ] );
  }
  public function plugins_loaded() {
    //* This method fires on plugins_loaded
  }
  //* WordPress doesn\'t fire a hook on public init
  public function public_init() {
    if( is_admin() ) return;
    //* Add some hooks for the public side
  }
  public function admin_init() {
    //* Add some hooks for the admin side
  }
  public function init() {
    //* Add some hooks for both public and admin side
  }
  //* Etc.
}
这就是我如何构造如何向插件和主题添加挂钩的方法。这不一定是最好的。这当然不是唯一的办法。

相关推荐

OOP development and hooks

我目前正在为Wordpress编写我的第一个OOP插件。为了帮助我找到一点结构,a boiler plate 这为我奠定了基础。在里面Main.php 有一种方法可以为管理员加载JS和CSS资产:/** * Register all of the hooks related to the admin area functionality * of the plugin. * * @since 0.1.0 * @access private