您不能插入do_action()
在这样的课堂上,你会犯一个致命的错误。
相反,您可以使用数组$skins
储存所有皮肤功能(如closures), 以及magic method _call()
给他们打电话:
class skinclass {
private $skins = array();
function __construct() {
$this->skins = apply_filters( \'add_skin\', $this->skins );
}
function __call( $name, $post ) {
if(isset($this->skins[$name]))
return $this->skins[$name]( $post );
}
}
正如你所见,我曾经
apply_filters()
能够在initializazion上添加皮肤,然后
__call
检查皮肤是否存在,如果存在,执行它。
因此,现在要添加蒙皮,您需要添加一个过滤器来修改$skins
属性:
// add skin1
add_filter( \'add_skin\', function( $skins ){
$skins[\'skin1\'] = function( $post ) {
$skin1 = \'<article class="skin1-holder">\';
$skin1 .= \'<h2 class="skin1-title">\'. get_the_title() .\'</h2>\';
$skin1 .= \'<div class="skin1-excerpt">\'. get_the_excerpt() .\'</div>\';
$skin1 .= \'</article>\';
return $skin1;
};
return $skins;
});
// add skin2
add_filter( \'add_skin\', function( $skins ){
$skins[\'skin2\'] = function( $post ) {
$skin2 = \'<article class="skin2-holder">\';
$skin2 .= \'<h2 class="skin2-title">\'. get_the_title() .\'</h2>\';
$skin2 .= \'<div class="skin2-excerpt">\'. get_the_excerpt() .\'</div>\';
$skin2 .= \'</article>\';
return $skin2;
};
return $skins;
});
等等,但是检索皮肤列表怎么样?我们可以向类中添加一个方法来实现这一点,因此可以在类中添加:
function get_skins() {
return array_keys($this->skins);
}
现在要使用类来获取实例,请执行以下操作:
$skinObj = new skinclass();
其余部分与您的代码非常相似:
// get skin function in plugin
$skins = $skinObj->get_skins();
// to output skin in a drop down list
foreach ($skins as $skin_name) {
echo "$skin_name\\n";
}
// output skin in front end
$func = \'skin1\';
echo $skinObj->$func( $post );