如果我用函数调用替换ADD_FILTER和ADD_ACTION会发生什么问题

时间:2016-01-28 作者:Yazan W Yusuf

我是WordPress的新手,为了进一步了解如何构建WordPress主题,我现在正在分析我下载的主题的代码,并尝试对其进行一些更改。

WordPress中的两个内置函数是add_filteradd_action, 他们都加了一个叫做HOOK 功能。所以当函数someFn 调用,所有与someFn 函数完成后调用someFn 使命感

我的问题是。

如果我正好在someFn 作用someFn(在函数末尾)而不是使用add_filteradd_action (两个函数的代码完全相同)。

这会不会对我的代码造成任何问题?

我知道有一些功能(如init 函数)存储在WordPress文件中,我不应该编辑它们。我只是在谈论如何利用主题功能。

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

我希望我理解正确,因为你的问题有点混乱

背景

功能就像你的汽车一样,在投入使用之前都是无用的东西。仅在中定义functions.php 或者,在一个插件中,它的功能就像停放在车库中的汽车一样有用,但在给定的时间点上却没有做任何有用的事情。

这就是操作和过滤器的用武之地。您的功能可以连接到一些过滤器或操作,在这些过滤器或操作中,它可以执行给定的任务,使其变得有用,就像现在开车上班一样,它成为了一个有用的对象。(函数也可以直接调用到模板中以使其有用)

挂钩有特定的任务

过滤器用于更改作为连接到过滤器的回调函数中的第一个参数传递的变量的值

假定操作执行回调函数指定的某种职责,这可以是属于该操作范围的任何操作,例如重定向到另一个页面或更改WP_Query

挂钩不仅被core使用,也被插件和主题使用。在任何场景中,任何钩子的主要目的都是使某些内容动态且可编辑,而不必直接修改给定的文件。主题、插件或核心可以由自定义插件更改,而无需直接更改任何代码。当涉及到更新核心、主题和插件时,这当然有巨大的好处

主题级过滤器和操作

要直接回答您的问题,您需要查看以下内容,您是否正在创建主题

为你自己

公共用途

如果您正在为自己创建一个主题,并且不打算公开发布,则可以不使用自定义过滤器和操作。

您可以将值设置为所需的静态值,而不是使用过滤器过滤函数或变量的返回值。另一方面do_action() 在模板中调用,您可以在需要的地方调用函数。因此,不要在模板中执行以下操作

do_action( \'some_action\' );
然后在函数中

add_action( \'some_action\', \'some_function\' );
function some_function()
{
    echo \'Some custom text\';
}
您只需在函数中执行以下操作

function some_function()
{
    echo \'Some custom text\';
}
然后直接在模板中调用该函数

some_function();
尽管您不打算公开发布主题,但使用自定义过滤器和操作仍然非常有用

如果您打算公开发布一个主题,那么您可以通过使用do_action() 调用,以便它们取消钩住您的函数,然后将自己的函数挂接到操作。

注意,为了方便起见,我们都倾向于使用闭包,但它们有一个巨大的缺点,即它们几乎是不可移动的,因为匿名函数没有回调名称。对于将公开发布的主题,如果您不希望某些内容是可移动的,那么应该避免使用闭包。而不是做

add_action( \'some_action\', function ()
{
    echo \'Some value\'
}):
宁愿这样做

add_action( \'some_action\', \'some_function\' );
function some_function()
{
    echo \'Some value\';
}
现在可以删除子主题或插件some_function() 从与的操作remove_action() 然后将自己的自定义函数插入/挂接到some_action 行动电话。使用闭包时无法执行此操作

相关推荐

Apply filters on date format

我使用Wordpress主题,其中格式日期和时间直接编码为两种格式:<?php the_time(\'d M\'); ?> <?php the_time(\'H:i\'); ?> 我想要的:显示wordpress选项中定义的日期和时间我不想在子主题中创建修改过的模板,我更喜欢使用函数。我已经在函数中添加了php。php此代码有效:add_filter( \'the_time\', \'changer_date_format\', 10, 1 ); //o