问题描述

我最近开始开发插件和主题,我发现我需要使用两个功能。

有时我想检查函数/类是否存在,在此之前声明为这样: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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。