在插件中创建帖子生成器外观

时间:2015-04-27 作者:freaky

目前,我正在开发一个插件,该插件将显示基于帖子类型的网格,并具有许多自定义设置。其中一个设置是在网格内显示的不同皮肤之间进行选择。

我想为开发人员提供一种可能性,让他们可以将自己的皮肤包含在自定义挂钩/过滤器中。

在插件中添加此功能的正确方法是什么?

我曾想过这样的事情,但我不确定这是不是正确的方法,是否会奏效:

// register skin class in plugin
class skinclass {
    //existing skins
    function myclass() {

    }
    do_action(\'add_custom_skin\');
}

// developers register action to include it\'s own skins (in function.php)
add_action(\'add_custom_skin\',\'my_custom_skins\')
function my_custom_skins($post) {

    function skin1($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;
    }

    function skin2($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;
    }

}

// get skin function in plugin
$skins = get_class_methods(new skinclass());
// to output skin in a drop down list
foreach ($skins as $skin_name) {
    echo "$skin_name\\n";
}

// output skin in front end
$func = \'skin1\';
$func();
要输出的皮肤将位于query\\u posts循环中。

2 个回复
最合适的回答,由SO网友:d79 整理而成

您不能插入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 );

SO网友:bueltge

我理解,您为开发人员添加了更改html的可能性,这是典型的模板部分。这就是问题所在,我认为您应该使用此作业的默认功能。get_page_template() 可以通过page_template 滤器

开发人员可以通过插件更改模板的一个简单示例。

add_filter( \'page_template\', \'wpse185512_page_template\' );
function wpse185512_page_template( $page_template ) {

    if ( is_page( \'my-custom-page-slug\' ) ) {
        $page_template = dirname( __FILE__ ) . \'/custom-page-template.php\';
    }

    return $page_template;
}
对于插件中的包含,请使用自定义函数,该函数包含路径中的文件。你在这方面找到了很好的参考资料question. 我认为在这里复制这一点没有帮助,你最好看到答案并理解解决方案。

结束

相关推荐

在WordPress中编写jQuery函数的正确方法

我正在使用基于AJAX的Wordpress模板(自定义),但在让jQuery正常运行时遇到了一些问题。我已经把所有的东西(按正确的顺序)排好了队,在某种程度上它确实起了作用,但我发现自己不得不写jQuery(\'... 与速记相反$(... 每次我想添加新的脚本片段时。我做错什么了吗?请参阅下面我的(精简)自定义JS文件;function customThemeFunctions(){ var windowHeight = jQuery(window).height();