问题描述
我最近开始开发插件和主题,我发现我需要使用两个功能。
有时我想检查函数/类是否存在,在此之前声明为这样:When to check if a function exists
但这被认为是不好的做法。什么是防止冲突和保持主题的最佳做法?插件独立工作,没有安装一个主题/插件?
最佳解决方案
行动&过滤器
imho 最好的方法是使用一个动作来将插件功能带入主题。
示例#1
这是一个小插件来测试这个。
<?php
/** Plugin Name: (#68117) Print Hello! */
function wpse68117_print_hello()
{
echo "Hello World!";
}
add_action( 'wpse68117_say', 'wpse68117_print_hello' );
主题内容:
<?php
/** Template Name: Test »Print Hello!« Plugin */
get_header();
// Now we call the plugins hook
do_action( 'wpse68117_say' );
现在发生什么/小孩
这样我们就不用检查一个函数,一个文件,一个类,一个方法,甚至一个 (不要这样做) 全局 $variable
的存在。 WP 实习生全球已经为我们这样做:它检查钩子名称是否是当前过滤器并附加它。如果不存在,没有任何反应。
示例#2
使用我们的下一个插件,我们附加一个需要一个参数的回调函数。
<?php
/** Plugin Name: (#68117) Print Thing! */
function wpse68117_print_thing_cb( $thing )
{
return "Hello {$thing}!";
}
add_filter( 'wpse68117_say_thing', 'wpse68117_print_thing_cb' );
主题内容:
<?php
/** Template Name: Test »Print Thing!« Plugin */
get_header();
// Now we call the plugins hook
echo apply_filter( 'wpse68117_say_thing', 'World' );
这一次,我们向用户/开发人员提供添加参数的可能性。他可以输出 echo/print
,甚至进一步处理 (如果你有一个数组返回) 。
示例#3
使用第三个插件,我们附加一个需要两个参数的回调函数。
<?php
/** Plugin Name: (#68117) Print Alot! */
function wpse68117_alot_cb( $thing, $belongs = 'is mine' )
{
return "Hello! The {$thing} {$belongs}";
}
add_filter( 'wpse68117_grab_it', 'wpse68117_alot_cb' );
主题内容:
<?php
/** Template Name: Test »Print Alot!« Plugin */
get_header();
// Now we call the plugins hook
$string_arr = implode(
" "
,apply_filter( 'wpse68117_grab_it', 'World', 'is yours' )
);
foreach ( $string_arr as $part )
{
// Highlight the $thing
if ( strstr( 'World', $part )
{
echo "<mark>{$part} </mark>";
continue;
}
echo "{$part} ";
}
这个插件现在允许我们插入两个参数。我们可以将其保存到 $variable
中,并进一步处理。
结论
通过使用过滤器和操作,您可以避免不必要的检查 (比较 function_*/class_*/method_*/file_exists
的速度或使用 in_array()
进行搜索以达到 1k(?) 过滤器搜索) 来提供更好的性能。您还可以避免让所有这些不必要的声明不设置变量等,因为插件关心这个。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。