插件和主题中的共享功能


Answers:


12

动作和过滤器

恕我直言,最好的方法是使用一个行动,将插件功能为主题。

例子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' );

现在发生了什么/库尔小子

这样,我们就不必检查函数,文件,类,方法甚至是否存在(不要这样做)global的存在$variable。WP intern global已经为我们解决了这个问题:它检查钩子名称是否为当前过滤器并将其附加。如果不存在,则什么都不会发生。

范例#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(?)过滤器搜索来搜索全局变量),从而提高性能。您还可以避免收到所有那些关于未设置变量等不必要的通知,因为该插件很在乎这一点。


2
深入了解最佳实践主题!
2012年

1
感谢kaiser,您将针对此问题提供最佳的最佳实践。再次感谢!
杰格·巴格斯

顺便说一句,我们需要为插件和主题之间共享的相同功能使用不同的名称,对吗?
杰格·巴格斯

假设我有函数我调用jlog,它将对变量进行简单的包装,并打印这些变量的内容。我在主题和插件上添加了jlog函数,如何防止任何冲突?
杰格·巴格斯

1
@JegBagus您是一个非常困惑的人:)请使用确切的功能更新您的问题,并解释它们的作用以及应该在哪里进行作用。并且请在这里整理您的评论。谢谢。
kaiser 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.