问题描述
我正在使用一个简单的搜索表单小工具,内置自动完成功能 (您可以下载当前版本的 here) 。该插件正在工作,但我正在使用 OOP 重写所有的代码。我遇到的一个问题是 Wordpress Widget 已经是 WP_Widget 类的一部分。我可以将代码分为 2 类。第一个加载所有脚本和 css,并初始化窗口小工具。这是代码的大纲:
class wdSearchForm {
public function __construct() {
// Action hook to load widget
// Register and enqueue styles
// Register and enqueue scripts
}
// register widget in WordPress so that it is available under the widgets section
public function wd_searchform() {
register_widget( 'wd_searchform' );
}
}
这里是 widget 类的大纲:
class wd_searchform extends WP_Widget {
// Constructor
function wd_searchform() {
}
// The widget itself
function widget( $args, $instance ) {
// The widget code
}
//Update the widget
function update( $new_instance, $old_instance ) {
// Update code
}
function form( $instance ) {
//Set up widget settings.
}
}
我想结合这两个,以便使用 wp_localize_script
并使用窗口小工具选项加载脚本。我应该怎么做欢迎任何建议,即使你会告诉我我完全错误的方向…
最佳解决方案
你可以简单地把你的 init 代码放在类的构造函数中。例如:
class myWidget extends WP_Widget{
function myWidget(){
// Init code here
}
function widget( $args, $instance ) {
// The widget code
wp_enqueue_script(...);
wp_enqueue_style(...);
}
// Over methods...
}
register_widget('myWidget');
我的偏好是将排队调用实际上放在短代码处理函数中,以避免与在给定页面上未使用的 JavaScript 和样式表相关联的开销和潜在冲突。
次佳解决方案
你的代码是 PHP4 风格。 PHP4 样式代码不应该被使用了。只是把一些函数放在一个类结构中就不是 OOP 。如果要编写可重用的代码,请分开代码。
例如:
class Widget_Setup
{
public $widget_class = '';
public $admin_styles = array();
public $admin_scripts = array();
public $front_styles = array();
public $front_scripts = array();
public $script_defaults = array(
'handle' => '',
'src' => '',
'deps' => array(),
'version' => false,
'in_footer' => false
);
public $style_defaults = array(
'handle' => '',
'src' => '',
'deps' => array(),
'version' => false,
'media' => 'all'
);
public function __construct( $widget_class = '', $admin_styles = array(), $admin_scripts = array(), $front_styles = array(), $front_scripts = array() ) {
$this->widget_class = $widget_class;
$this->admin_styles = $admin_styles;
$this->admin_scripts = $admin_scripts;
$this->front_styles = $front_styles;
$this->front_scripts = $front_scripts;
add_action( 'admin_print_styles', array( $this, 'add_styles' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'add_scripts' ) );
add_action( 'wp_enqueue_scripts', array( $this, 'add_styles' ) );
add_action( 'wp_enqueue_scripts', array( $this, 'add_scripts' ) );
if( ! empty( $this->widget_class ) )
add_action( 'widgets_init', array( $this, 'register_widget' ) );
}
public function register_widget() {
register_widget( $this->widget_class );
return true;
}
public function add_styles() {
$styles = ( is_admin() ) ?
$this->admin_styles : $this->front_styles;
if( empty( $styles ) )
return false;
foreach( $styles as $style ) {
$style = wp_parse_args( $style, $this->style_defaults );
wp_enqueue_style(
$style['handle'],
$style['src'],
$style['deps'],
$style['version'],
$style['media']
);
}
return true;
}
public function add_scripts() {
$scripts = ( is_admin() ) ?
$this->admin_scripts : $this->front_scripts;
if( empty( $scripts ) )
return false;
foreach( $scripts as $script ) {
$script = wp_parse_args( $script, $this->script_defaults );
wp_enqueue_script(
$script['handle'],
$script['src'],
$script['deps'],
$script['version'],
$script['media']
);
}
return true;
}
}
这个类可以重用于每个 widget 。 OOP 背后的想法是通过编写具有附加功能的数据结构来重用您的代码。没有使用类结构,因为有人说它是好的风格。
该类可以这样使用:
class MyAwesomeWidget extends WP_Widget
{
const TEXTDOMAIN = 'widget_textdomain';
public function __construct() {
parent::__construct(
'widget-name-id',
__( 'Widget Name', self::TEXTDOMAIN ),
array(
'classname' => __CLASS__,
'description' => __( 'Short description.', self::TEXTDOMAIN )
)
);
$admin_style = array(
array( 'handle' => 'somehandle', 'src' => 'path/to/source' ),
array( 'handle' => 'someotherhandle', 'src' => 'path/to/source' ),
);
$admin_scripts = array(
array( 'handle' => 'scrpthandle', 'src' => 'path/to/source', 'deps' => array( 'jquery') ),
);
$front_styles = array(
array( 'handle' => 'frontstyle', 'src' => 'path/to/src' ),
);
new Widget_Setup( __CLASS__, $admin_style, $admin_scripts, $front_styles );
}
public function widget( $instance, $args ) {}
public function update( $new_instance, $old_instance ) {}
public function form( $instance ) {}
}
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。