在下面的代码中,底部两个函数下的钩子不应该放在构造函数中吗?
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\' ) );
}
最合适的回答,由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.
}
这就是我如何构造如何向插件和主题添加挂钩的方法。这不一定是最好的。这当然不是唯一的办法。