设置bbPress论坛的分步指南–第5部分
动作和过滤器添加了一种强大的方式,可以改变bbPress(当然还有WordPress)的工作方式。
对于WordPress的新手来说,它们可能也是最难理解和查找信息的领域之一。本教程试图揭开其中一些领域的神秘面纱,并帮助新手编写代码,使他们的网站能够按照自己的意愿工作。
第4部分处理“操作”时,本节处理“过滤器”
它确实重复了Actions中的一些初始文本,因为它适用于两者。
如果你熟悉函数和过滤器,你可能不需要阅读这篇文章的大部分内容,但我想如果你在这里,那么你会像我一样看到一些片段和“简短”的解释,这些片段和解释会让你非常确定你想要的可以完成,但无法找到确切的方法或使其工作。
因此,在这个阶段,冲一杯咖啡,把孩子们关在门外,我将尝试向你们介绍我到目前为止学到的关于过滤器的知识。
如果您可以改进解释,纠正我所犯的任何错误,或者以任何其他方式提供帮助,只需在支持论坛上发布一个关于“请求和反馈”的主题,我会继续关注。
如果操作在特定点添加内容(请参见第4部分)过滤器是一种在特定点更改显示内容(通常是数据的哪些位或格式/顺序)的方法,而无需更改文件中的代码。
如果
- 数据显示在多个位置(例如作者姓名的显示方式)-对于所有出现的情况,只需更改一次
- 您想要更改的文件位于代码的核心,所以您不想更改原始文件
- 您开始编写插件供他人使用–过滤器允许您在不接触实际php文件的情况下更改大量代码
所以从本质上来说添加和过滤器更改。 但是过滤器实际上是什么过滤器? 它过滤了一个函数,所以我们需要在前进之前了解函数
函数是一组代码,当组合在一起时会执行某些操作。在WordPress中,函数既可以隐藏复杂性,又可以节省到处重复的无休止的代码行,还可以提高可管理性。
所以在bbpress中,进入数据库并获取帖子作者身份的代码行都被放入一个名为bbp_get_reply_author_id的函数中。任何时候我们想这样做,都可以引用该函数,并使用多行代码来保存自己。如果bbPress背后的人想改变它的工作方式,他们只需要做一次,所有使用这个的实例都会使用新函数。
所以让我们创建一个简单的函数(稍后我们将看到一些真实的bbPress示例!)
函数hello(){$text=“你好,罗宾”;echo$text;}
第1行创建函数
第2行将$text变量设置为Hello Robin
第3行将该文本写入屏幕
然后每当在wordpess-php文件中调用时,例如
您好();
它会写出结果。
我们可以将此函数放在functions.php文件中,或放在插件中。
现在bbPress是一个插件,在bbPress中,有数百个函数位于多个位置。
所以想象一下,有人在上面写了“hello”函数,并把这个函数埋入了他们的插件中,这个函数在很多地方都有使用。然而,你不想让它说“你好罗宾”,而是“你好弗雷德”。现在您可以在插件中找到函数并更改文件中的代码,但在插件的任何升级中,您都会丢失更改。因此,如果您可以更改变量$text,并且过滤器提供了一种方法,那会更好。
上面的函数不能被过滤,因为它还没有被编写成允许过滤的——希望您遇到的所有函数都已经被过滤了——所以让我们重新编写它以使其可过滤。
函数hello(){$text=“你好,罗宾”;$text=应用过滤器('hello',$text);回声$text;}
已添加第3行。本质上说,如果存在过滤器,则将该过滤器中的$text值替换为函数。
因此,现在如果我们创建一个过滤器并向其添加一个更改$text的函数,那么无论$text在该过滤器中的值是什么,都会替换函数中$text原来的值。所以我们可以让“Hello Robin”变成“Hello Fred”,而不需要修改任何代码。
因此,让我们为此创建一个过滤器。与操作一样,我们通过创建函数来实现这一点。
所以上面的原始代码被隐藏在其他插件中。我们的新代码将位于函数文件或插件中,并更改原始代码的效果,将$text=“Hello Robin”更改为$text=”Hello Fred”。
因此,生成的代码看起来像
//函数将“Hello”函数中的“Hello Robin”更改为“Hello Fred”函数called_anything(){$text=“你好,弗雷德”;返回$text;}add_filter('hello','called_anything');
让我们来看看这个。
首先让我们处理命名
我们正在创建一个函数,函数可以被调用。然而,每个功能(已经有数千个)必须在您的网站上有一个唯一的名称。考虑到你有核心的wordpress和可能有很多插件,重要的是不要创建重复的名称。将其称为“robin_w_hello”可能会使其非常独特。
在函数的开头添加注释行来提醒您这是在做什么也很重要,因为当您的文件中开始有很多注释行时,您永远不会记得这一点是做什么的。
在第1行中,我们使用函数called_anything()。()是将任何变量放入函数中的区域。因此,如果我想修改$text而不是替换它,我会将其放入()中,以便将其引入ie函数called_anything($text)。在这种情况下,我可以使用一些字符串操作从前面去掉hello。因此,如果您想操作核心函数中的数据,请将其导入此处。
第3行包含一个返回命令。这样可以确保将数据传递回主函数。如果省略,那么您计划更改的任何变量都将为空,因此不会显示。
在最后一行中,我们向“hello”添加了一个名为“called_anything”的过滤器
在这种情况下,我们添加了过滤器。还有另一个名为remove_filter的命令用于删除过滤器——如果其他人的插件中有一个过滤器进行了您不想要的更改,则该命令非常有用。
好吧,如果你现在还没有发疯,你就申请使用名称筛选对函数,而不是对函数名应用筛选器。因此,apply_filter可以与函数具有不同的名称,实际上,在一个函数中可以有多个过滤器。
因此,虽然我们在函数“hello”中有一行是这样说的
$text=apply_filters('hello',$text);
applyfilter(“hello”是过滤器的名称,可以是任何东西(或者说是站点特有的东西!)
因此,虽然没有人会以这种方式编写函数,但我们可以
函数hello(){$text1=“你好,罗宾”;$text1=应用过滤器('hello_change1',$text);$text2=“再见罗宾”;$text1=apply_filters('hello_change2',$text);回显$text1.$text2;}
除非你需要知道,否则我不会告诉你这个,所以你会经常发现wordpress和bbPress中的过滤器与它们的函数名不同。事实上,我们稍后会看到,它们经常是不同的,但它们有一个逻辑,这曾经是已知的,意味着你可以解决它。
数组是保存在单个数据名中的一组数据
例如
$data=数组(
“name”=>“Robin”,
“年龄”=>“21”,
);
数组$data现在包含我的姓名和年龄。
大多数bbPress函数创建数组,因为它们使用多个数据,所以让我们创建一个具有数组的函数,并输出一些数据
函数hello(){$data=数组(“name”=>“Robin”,“年龄”=>“21”,“text”=>“年”,);$data=应用过滤器('hello',$data);echo$data[“名称”]。“是”$数据[“年龄”]$数据[“文本”];}
在php文件中调用hello()将导致以下结果
“罗宾21岁。”
比方说,我们想把措辞改为“罗宾21岁了。”
因此,我们需要将$data['text']改为“years young”
因此,我们将编写一个函数来完成此操作,并添加一个过滤器来实现它
结果如下
//这将添加一个过滤器,将$data['text']更改为'years young'函数called_anything($data){$data['text']='年轻几岁。';返回$data;}add_filter('hello','called_anything');
让我们仔细看看
如果我们刚刚有了“function called_anything()”,那么我们所做的任何更改都将重置整个数组,因此我们需要“引入”当前值calledanything($data)'将数组引入我们的新函数。
第二行更改“text”值,第三行将新数组返回到原始函数
所以现在这个数组看起来像
'name'=>'罗宾',
“年龄”=>“21”,
“text”=>“年轻几岁”,
结果是“罗宾21岁了”——完成了!
现在我们准备看一些真实的bbPress示例。
那么我们需要查看的代码在哪里?
这当然是bbPress的第一个问题(就像WordPress的其他部分一样)——找出需要修改的文件。
对于bbPress,所有关键的模板文件(最有可能是您想要更改的)都保存在文件夹中
Wp-content/plugins/bbpress/templates/default/bbpress(Wp-内容/插件)
虽然许多名字都能很好地说明它们的作用,但在找到你想要的名字之前,你可能需要深入研究几个名字。
我计划列出这些模板,以及它们在我完成时所做的事情!
但让我们从WordPress中显示的内容开始,然后再进行修改。您已经找到了涵盖此内容的模板文件,其中有一个函数,用于显示要更改或更改其显示的数据。
所以我们需要创建一个过滤器。
在本教程中,我们将生成您需要的代码,但很明显,代码需要放在某个地方。那么我们把它放在哪里?
我们将动作或过滤器添加到函数文件中,或将其创建为插件。
这两种方法都有各自的用途。
如果你喜欢使用插件,那么它们是一种添加更改的好方法,如果你有多个站点,它们也能很好地工作,因为插件很容易上传到每个站点。但他们确实需要更多的知识来编写代码。但是在谷歌上搜索主题,你会发现创建主题有很多帮助。然后把代码放进去,上传到你的网站上。
另一种方法是使用函数文件。由于您现在正处于使用WordPress的“高级”阶段,您应该要么开发自己的主题,要么使用Childtheme存储细节。
如果你仍然只有其他人的主主题(例如wordpress默认主题、免费主题或高级主题),那么你应该创建一个子主题。这只是使用主主题,您可以将调整添加到子主题。然后,如果更新了主主题,则不会覆盖子主题中的调整。有关创建儿童主题的帮助,请在谷歌上搜索“儿童主题wordpress视频”,您会发现许多演示。如果有人已经为你建立了一个网站,它可能已经是一个在一个孩子的主题,再次视频会让你看看是否是这样。
在我们的子主题中,我们将放置一个functions.php文件,我们设置的操作和过滤器将进入其中。
所以,为了开始了解我们需要做什么,让我们看看我们可能想要改变的东西
在论坛展示中,我们在每个论坛旁边都有一些主题和回复,即:
假设我们要删除这些计数并使其看起来像
现在我们可以通过更改执行此操作的模板来完成此操作。事实上,法典有一页布局和功能–您可以使用的示例第2节介绍了如何通过更改名为loop-single-forum的模板来更改此设置。但是,如果我们更改了该模板,则需要将其存储在不同的位置,以便以后的更新不会覆盖它。这很容易做到,没有理由不这样做,但添加过滤器也是一个同样有效的选择。
那么从哪里开始呢?
好吧,让我们先总结一下我们将要做的事情,然后您可以按照这些步骤进行操作。
a) 查看模板,找出哪个模板具有我们想要更改的功能
b) 查看代码,看看是否有该函数
c) 如果是这样的话,我们可以看到论点,
d) 如果没有,那么我们需要查找函数定义
e) 然后对过滤器进行编码
看起来很容易,但这有点像侦探,你必须遵循线索。
a) 首先,我们发现bbPress将插件的所有主要“显示”区域存储在一个位于的模板文件夹中
wp-content/plugins/bbpress/templates/default/bbpress
我计划列出哪些模板做什么,但目前这确实是一个智能猜测和大量打开文件和检查的情况。通常,任何包含列表的东西都会运行循环(遍历列表),所以循环是一个不错的选择。
因此,由于我们正在查看论坛列表,我们隐约看到了具有循环和论坛的模板。在某些阶段,我们打开了循环论坛,在那里我们看到了从论坛标题、论坛描述、子论坛,然后是一些主题、回复和新鲜度计数的进展。
单击此处查看文件–在新窗口中打开,以便您可以在该窗口和代码之间切换。
第30行的子论坛列表部分
bbp_list_forums();
看起来很可能是候选人,所以让我们看看这个。我们接下来会这么做。
b) 所以让我们看看代码,看看关于这个函数写了什么。转到文档(本节)并选择任何一篇文章——您实际上正在阅读这篇文章,所以这很好。在左手边,你会看到一个“相关”区域。您需要从本文向后滚动才能看到它。在列表中查找函数–在本例中为'bbp_list_forums',它已经列出了(还不是全部!)
打开这个,你会看到它列出了下面的参数(同样也不是所有参数都列出了,所以请看d),如果你的参数不在那里的话。
其中包括“显示主题计数”和“显示回复计数”,您会看到它们被设置为“True”——将它们设置为false应该会隐藏细节。
您还会看到一行,上面写着“要过滤这个数组,请使用add_filter('bbp_before_list_forums_parse_args','your_filter_name)”,这就是我们需要的过滤器。如前所述,过滤器名称可能与函数名称不同。因此,bbp_list_forums使用“bbp_before_list_forums_parse_args”来更改数组。(实际上,这个函数中还有一个过滤器,它有函数名,但我们暂时忽略它!)
因此,我们将创建一个函数来更改主题并将值回复为false,这样它们就不会显示,并添加一个过滤器来实现它。
数据保存在一个数组中,因此我们需要使用该代码。
所以让我们从函数开始
函数hide_forum_counts($args=array()){$args['show_topic_count']=false;$args['show_reply_count']=false;返回$args;}
然后我们将添加过滤器
添加过滤器('bbp_before_list_forums_parse_args','hide_forum_counts');
此代码将放在我们的函数文件中(或作为插件)。
d) 但如果法典没有显示过滤器呢?我们如何找到要使用的过滤器?
好的,我们可以解决这个问题。我们将从bbp_list_forums开始。我们需要为定义该功能的地方提供资金。
现在,模板wp-content/plugins/bbpress/templates中使用的所有函数都保存在以下5个模板文件夹中:
wp-content/plugins/bbpress/includes/forums/template.php
wp-content/plugins/bbpress/includes/topics/template.php
wp-content/plugins/bbpress/includes/replies/template.php
wp-content/plugins/bbpress/includes/users/template.php
wp-content/plugins/bbpress/includes/search/template.php
当我们列出论坛时,我们可以打赌它会出现在wp-content/plugins/bbpress/includes/forums/template.php中,但如果你没有线索,那么将插件下载到你的电脑上,将其解压缩到一个目录中,然后使用你电脑的serach函数查找它。但一定要搜索“bbp_list_forums”,而不是“bbp_list_forum()”'因为bbPress函数通常都有参数,所以()将包含内容,您的搜索将返回nil!
所以我们找到wp-content/plugins/bbpress/includes/forums/template.php
然后把它打开。我们在744号线看到里面
函数bbp_list_forums($args=''){
然后去801线
echo apply_filters('bbp_list_forums',$r['before'].$output.$r['after'],$r);
因此,我们认为要添加的过滤器是“apply_filters('bbp_list_forums'”。但不,这个过滤器是在所有函数都发生之后才添加的。我们只想更改几个输入参数。
在函数的开头,我们发现:
//根据默认值分析参数$r=bbp_parse_args($args,数组('之前'=>;'&书信电报;ul类=;bbp-论坛-列表>;','之后'=>;'&它/ul>;','link_before'=>;'&书信电报;li类=“;bbp论坛>;','link_after'=>;'&它/li>;','count_before'=>;'(','count_after'=>;')','count_sep'=>;',','分隔符'=>;',',“论坛id”=“”,“show_topic_count”=>;是的,“show_reply_count”=>;是的,),'列表论坛');
这是bbPress中常见的格式,实际上与wordpress中使用的函数类似。
它使用一个名为“bbp_parse_args”的函数来创建针对所有参数的过滤器。
创建的过滤器的格式为“bbp_before_”,后跟X,后跟“_parse_args”。X是bbp-parse_args函数的第三个参数–如果您查看上面的代码,就会发现它实际上是
bbp-parse_args($args,数组(…),'list_forums')
所以在最后一行,我们看到了“列表论坛”,即上面的X。实际上,这是没有bbp起始位的函数。
因此bbp_list_forums的数组过滤器是“bbp_before_list_forums_parse_args”
例如,bbp_get_topic_pagination将是
bbp_before_get_topic_pagination_parse_args之前
好的,这是一个很长的解释,需要你读几遍,随着我的进度,我会添加更多的例子。
如上所述,如果需要任何反馈或澄清,请在
请求和反馈