WordPress主题开发的钩子是什么?

时间:2020-04-21 作者:Praveen Kumar

我想知道hooks 在wp主题中,如before\\u header\\u hook,after\\u header\\u hook?这些挂钩在主题开发中有什么用途和好处?

2 个回复
SO网友:Howdy_McGee

WordPress是一个由不同代码组件组成的完整包,它们共同提供一个功能性的内容管理系统。WordPress核心、插件和主题都是这个包的一部分。由于这些组件中的一些单独更新,您不想直接编辑代码,否则在这些组件更新时,您的更改将被覆盖。因此,WordPress实现了system of Hooks.

<小时>Action hooks 允许您将功能注入特定的运行时点。您可以使用这些操作挂钩创建自己的插件或主题,以便在组件更新时它们不会被覆盖。例如plugins_loaded 是一个动作挂钩,在运行时加载所有插件后运行。如果您想在页面请求期间加载所有插件后运行特定功能,您可以说:

function example_plugins_loaded_callback() {

    // Print a message then stop page request load.
    print( \'All plugins have been loaded successfully!\' );
    exit();

}
add_action( \'plugins_loaded\', \'example_plugins_loaded_callback\' );
加载所有插件后,上述消息将打印到屏幕上,页面请求停止加载其他文件。这是一个简单的用法示例,但这是动作挂钩工作原理的要点。如果愿意,此时可以调用API或写入数据库。

如果没有操作挂钩,如果要打印上述内容,则需要编辑wp-settings.php 当WordPress更新时,该文件最终将被覆盖。当plugins_loaded 吊钩运行。

<小时>Filter Hooks 允许您修改函数生成的特定值。与动作挂钩不同,它们需要返回值。过滤器挂钩就是一个很好的例子the_title 允许您修改the_title()get_the_title() 将值打印到屏幕之前。您可以通过以下方式直接查看代码:viewing the function on trac. 函数和回调类似于动作挂钩:

function example_the_title_callback() {

    return \'Example Title\';

}
add_filter( \'the_title\', \'example_the_title_callback\' );
使用上述过滤器挂钩the_title() 将立即打印Example Title 相反

钩子还带有优先级和参数数量。您需要查找每个钩子,以了解传递给钩子的参数是什么,但它是这样的:

add_filter(
    \'the_title\',                    // Hook Name
    \'example_the_title_callback\',   // Callback Function Name
    10,                             // Priority
    2                               // Number of arguments
);
  • Hook Name - 并非每个函数都有可用的挂钩。您需要使用Developer Docs.
  • Callback Function - 要触发的函数的名称
  • Priority - 当你想让钩子跑的时候。挂钩可以附加多个功能,有些可能不是您的(插件或主题)。低优先级将在高优先级挂钩之前运行
  • Number of Arguments - 传递给回调函数的参数
需要告知传递多个参数的挂钩,以便为回调函数提供这些参数。the_title 钩子传球$title$post_id. 如果我们想使用$post_id 我们需要告诉add_filter() 函数将其传递给回调函数:

/**
 * One Argument Hook
 */
function example_the_title_callback( $title ) {

    /**
     * - By default we always get 1 argument if possible.
     * - We do not have access to $post_id at this point.
     */
    $new_title = $title . \'!!!\';

    return $new_title;
}
add_filter( \'the_title\', \'example_the_title_callback\' );

/**
 * Two Arguments Hook
 */
function example_the_title_callback( $title, $post_id ) {

    /**
     * Since we specified 2 arguments, we receive the 2 arguments that the hook provides
     */
    $post = get_post( $post_id );
    $new_title = $title . \' - \' . $post->ID;

    return $new_title;
}
add_filter( \'the_title\', \'example_the_title_callback\', 10, 2 );
同样,您需要在开发人员文档中查看钩子传递的参数。

最后,作为主题或插件开发人员,您可以添加自己的自定义挂钩,允许其他开发人员添加或修改特定功能。

假设您编写了一个插件,将文章标题包装在<span> 用于特定样式的HTML标记。您可以添加一个钩子,允许其他开发人员向您的范围添加自定义类,如下所示:

/**
 * My super cool plugin
 * Add HTML span tags around titles
 * Our plugin CSS can style them cool later
 */
function supercool_title( $title ) {

    // Allow theme developers or plugin developers to add classes to our span tag.
    $classes = apply_filters(
        \'supercool_title_classes\',      // Our custom filter name
        array(),                        // Array of classes to pass to the filter, empty in this scenario
    );

    // Filters always return
    return sprintf( \'<span class="%s">%s</span>\', esc_attr( implode( \' \', $classes ) ), $title );

}
add_filter( \'the_title\', \'supercool_title\' );
作为一个主题开发人员,如果我想的话,我可以使用这个插件挂钩添加到我自己的类中。

/**
 * Theme Devloper modifies plugin functionality
 * Adds specific class to the super cool plugin title wrapper
 */
function my_theme_supercool_title_classes( $classe ) {

    $classes[] = \'special-title\';
    return $classes;

}
add_filter( \'supercool_title_classes\', \'my_theme_supercool_title_classes\' );

// Output
<span class="special-title">Post Title</span>
在创建主题或插件时,可以对动作挂钩执行相同的操作。WooCommerce在其模板系统中使用了许多动作挂钩,允许其他插件和特定主题添加到输出中。类似于:

do_action( \'before_header_hook\' ); // A custom action hook created by the developer.
如果愿意,只允许您在该点注入特定代码。可能是一个分析脚本或一个实用程序导航的整个HTML包装器,主题以前不支持。可能性是无限的!

SO网友:Amir

无论何时,只要你想在WordPress中做一些事情或定制一些东西,那么很可能有一个钩子可以使用。

“do”挂钩称为“action”只要定义了操作,就可以执行自己的代码。以下是一些示例:

发布帖子后,向作者发送电子邮件

钩子函数是定制的PHP函数,我们可以在其钩子指定的位置“钩子”WordPress。