!
也想出现在这里? 联系我们
广告位

WordPress子主题中覆盖父主题的函数功能

如果您有使用 WordPress 中的父主题和子主题的经验,您会知道子主题中的模板文件会覆盖父主题中的模板文件。例如,如果您的父主题具有 page.php 文件,# e F ( b 3并且您在子主题中创建了一个同名的新文件,那么 WordPress 在显示页面时将使用子主题的这个 page.pZ , [hp 文件。

您可能会认为函数(function)会以相同的方式工作:在子主题的 functions.php 文件中创建一个与父主题名称相同的新函数,它将优先运行。不幸的是,它并非如此简/ % D D单。

在研究覆盖父主题中的函数的方法: | I - [之前,它有助于了解函数在父主题和子主题| ` ) -中的工作方式。首先,您需要知道当您使用子主题时,父主题中的所有函数都将运行。您无需在子主题的功能文件 functions.php 中添加任何内容即可实现此目的。这与 CSS 不同,在 CSS 中,您必须手动将父主题的样} m % z w r Y 4 W式表包括在子主题的样式表中。

此外,如果您的父主题和子主题具有相同名称的函数,则这将破坏您的网站,除非父主题中的函数是可插拔的函数(稍后将对此进行详细介绍)。这就是为什么为所有函数需要使用前缀并且在父主题和子主, i t M R 9 S &题中使用不同的前缀(以防万一)的原因。: L O W t . n 0但是,您可以更改函数的触发顺序,并且可以完全阻止函数触发,我们将很快看到。

可插拔(扩展)函数(Pluggable Functions)是您在父主题中编写的代码,因此,如果您正在使用不具有可插拔功能的现有父主题,则它们对您没e N } m . o - - S有任何用处。

但是,如果您正在编写自己的父主题,或者作为将来项目的起点,或者正在创建自己的主题框架,则最好使函数可插拔,以G { % | &便可以轻松地在子主题中覆盖它们。浏览正在使用的父主题中的函数也是一个好主意,因为其中许多函数7 m l k e(包括 WordPress 默认主题)将具有可插拔功能。

要编写可插拔函? 0 p i Q K =数,只需将其封装在条件标记中,以检查具有该名称的函数是否已运行:

  1. <?php
  2. if ( ! fu$ + ! Ynction_exists ( 'my_function' ) ) {
  3. fue / 0 ; L ( wnction my_function() {
  4. // Contents of your function here.
  5. }
  6. }
  7. ?>q K ^

因此,如果您将父主题I * q X n v l A中的函数包含在这样的条件标记中,则 WordPress 将检查子主题中是否已经有同名函数已经运行过,如果是这种情况,它将不会运行] ^ 6 ) e 7父主题的函数。

然后,当您要在子主题中编写要覆盖父主题中的功能的函数时,只需为其命名与父主题中的名称相同即可:

  1. <B d ~ @ , N E?php
  2. function} C j ; y my_function() {
  3. // Coc v Cntents for your function ovc u s terride here.
  4. }
  5. ?>

WordPress 将首先在子主题中运行该函数,当涉及到父主题中的函数b V ^ 3 s W时,它将检查它是否已经存在,并且因为E & ; H . # S \它已经存在,所以不会运行它。

如果您没有使用自己的父主题,或者正在使用没有可q + I r \ s插拔函数的第三方主题,则需要另一种方法。在编写函数时,可以为它们分配优先级,告诉 W\ & O , s 8 v MordPress 何时运行它们。将函数添加到动作或过滤器挂钩时,可以执行此操作。WordPress 将按照优先级的升序运行附加到给定钩子上的函数,因此优先级数字更大的那些将最后运行。让我们想象一下父主题中的函数! / - c , 4 , +不可插拔,并且看w 0 p - V l w Z起来像这样:

  1. <?php
  2. function parent_function() {
  3. // ContentT & i 8 ms for your function here.
  4. }
  5. addV = 6_action( 'init', 'parent_function' );
  6. ?>

此函数已附加到r c J , z j init 钩子上,尚未获得优先级。默认情况下,WordPress 会为尚未添加优先级的功能分配优先级为 10 ,因此要在该函数运行后执行新函数,请使用大于 10 的数字。我倾向于使用 15 ,以便! 6 % q y S ( 9在以后要在: r V两者之间添加另一个函数的情况下留出一些喘息的空间。

这意味着您的子主题中的函数将如下所示:

  1. <?php
  2. functik \ M @ 7on child_function() {
  3. // Contents for your function here= ^ Y m r w.
  4. }
  5. add_action( 'init', 'child_function', 15 );
  6. ?>

或者,您父主题中的函数可能已分配了V D x K a q : f v优先级:

  1. <?php
  2. fun/ ~ d ? W &ction parent_f) z R s a l Nunction() {
  3. // Contents for your function here.
  4. }
  5. add_action( 'init', 'parent_function', 20 P 0 E } . s M M E1;;
  6. ?>

因此,您只需要确保在子主题中赋予该函数更高的的优先级:

  1. <?php
  2. function chil] e a L W T O s cd_function() {
  3. // Contents fory C $ P q D O o o your functiv S , Y + F W fon here.
  4. }
  5. add3 & ~_action( 'initD U i u 8 M * X o', 'child_function', 25 );M / ] W / 6 E N ]
  6. ?>

有时,在第一个函数之后* m 7 O } 9 .运行另一个函数不足以覆盖它 - 您需要确保父主题中的函数根本不运行。在这种情况下,您可以\ d k # * , n使用 remove_action() 或 remove_filter() 函数将父主题函数从其附加的挂钩中删除 。您将使用的函数取决于该功能是附加到b r k G d \ y } 7父主题中的动作挂钩还是过滤器挂钩。让我们回到父主题中的上一个函数:

  1. <?php
  2. function parent_function() {
  3. // Contents for your function here.
  4. }
  5. add_action( 'init', 'parent_function' );
  6. ?>

要将函数从其动作挂钩中删除3 o K k \ = : H并防止触发,请在子主题中创建一个函数,以使用 remove_action()以下方法将其删除 :

  1. <?php
  2. reL L Imove_action( 'init',D q : I N 3 O r 'pa{ 4 5 u ;rent_function' );
  3. ?>

但是,这不能单独工作-您需要将此函数附加到一个钩子上, 该钩子将在x , * : . 9 7 u ,附加了父主题函数的钩G X a W : $子之后触发 。这是因为您无法在触发操作之前将其删除w S A 0 l W :。您可2 S \以在官方文档中找到触发操作顺序的详细信息 。

  1. <?php
  2. function child_remove_parent_functi1 w t h k 1 e ( fon() {
  3. remove_action( 'init', 'parent_function' );
  4. }
  5. add_action( 'wp_loaded', 'child_remove_parent_function' );
  6. ?>

完成此操作后,您可以在子主题中编写一个替代函数来替换父主题的函数,或者如果您要做的只是从父主题中删除该功能,4 g u [ ?那您什么也不需要做了。

请注意,如果您尝试使用 rW D z n \ .emt O . o q \ . oove_action() 或 remove_filter() 删除函数功能 , 并且该函数已分配了优先级,则删除时必须包含该优先级,否则它将无法正常工作。因此,如果父主题中的函数如下所示:

  1. <?php
  2. function parent_functio= l X ( ` K i n nn() P + - x F &3;
  3. // Contents for your function here.
  4. }
  5. add_action( '0 d S x o F : finit', 'parent_function', 15 );i N 7 r : \ U - N
  6. ?>

删除时,您需要包含相同的优先级值:

  1. <?php
  2. function child_remove_parent_function(b ^ P K } k e) {G l k t a 0 g i
  3. remove_action( 'init', 'parent_function', 15 );
  4. }
  5. add_action( 'wp_d } Q D 7 &loaded', 'chil| u yd_remove_parent_function] d D y 8 f' );
  6. ?>

除上述内容外,在某些特定情况下,您可能需要进一步处理。以下提示是针对以下评论中提出的问题的解答。严格来说,您不能部分覆盖函数。您只能让它运行或禁用它。但是有解决方法。

第一种是您要部分覆6 & 9 { \ #盖的函数本身q # ? W h B T F包含可插拔的函数。您可能会发现该函数包括从父主题中调用q N Y r 1 7 D z另一个可插拔函数。在这种情况下,如果您要更改的代码,则y f E可以覆盖主函% $ l R ? {数中的任何函数。通过编写新版本的可插拔函数来做到这一点,该函数仅包含一条 return 语句或包3 _ G Y e含替代代码。请注意,这仅在该函数可插拔时才有效;否则,您的站点将中断。

% E 2 G ) k p #是,仅当您足够幸运地需要重写由另一个包含的可插入函数提供的函数中的功能时,此方法才有效。在大多数情况下,这不是一个选择。在这种情况下,您将需要停用该函数,并使用其他名称的自己的函数来替换它。要创建新函数,您可以将函数从父主题复制并粘贴到子主题的 functions.php 文件中,然后对其进行编辑以删除不需要的代码。

您将使用两个自己的函数:一个删除8 ~ # 5原始函数,第二个提供新代码) a V u g,如下面的示例覆盖在 init 钩子上调用的父主题:

  1. <?php
  2. fb ` M C 0 = Ounction remove_parent_funct\ H l . L l v mion(
  3. remove_actionD ` A \ \ p M( 'init', 'parent_theme_function');
  4. )
  5. add_action( 'wp_loaded', 'rem| ` Z r # ,ove_J / 9 O % cparent_function');
  6. function child_theme_function(
  7. // contents of child theme function based on original parent theme function
  8. )
  9. add_action( 'init', 'child_theme_functioW t x n | X ]n'): p W n ] j;;
  10. ?>

父主题中不可C c j / s 4 n @插拔的0 e Y [ G j | 9函数不能以任何特殊方式覆盖。因此,您必须使用上述方法,I . f从其动作挂钩中删除该函数,然后在提供新代; } ]码的同一动作挂钩上编写一个新函数。不要给子主题中的函数命名与父主题中的函数相同的名F H + ) $ + i X称,因为这会破坏您的站点!

函数通常不设计为可扩展的N Q V P E N W。但是,如果您的函数包含对其他可插拔函数的调用,则可能会有例外。在这种情况下,您可以通过覆盖主功能中的函数来扩展功能,而不必替换整个主函数。在大多数情况下,您只能通过以下三种方式之一扩展父主题函数:

  • 如果您要扩展的函数是可插拔的,请将其复制到您的子主题中并添加额外的^ ` { 1 { L x代码以对其进行扩展。: K W 2 i m y _ 4
  • 如果该函数不可插拔,请使用remove_action()将该钩子从其挂钩中删除,并使用相同的代码在同一个钩子上编写一个新函数(名称不同)。您可以将代码从原始函数复制到新函数中并进行编辑。
  • 编写第二个函数,该函数在与第一个函# X *数相同的钩子上调用,并添加T % X c i将在第一个函h h m Z 3 e数之前或之后运行的额外代码。在add_action()中使用优先级(priorito x Q f b K G ~y)参数,指定您的第二个函数将在原始函数之前还是之后运行。

您使用哪种方法将取决于父主u ~ g题的编码方式以及是否需要完全删除父主题的函数功能,还是仅在其后运行另一个函数以覆盖它。

给TA打赏
共{{data.count}}人
人已打赏
WordPress教程

WordPress用户注册页面添加自定义文字提示

2022-9-10 3:48:43

WordPress教程

WordPress点击“回复”时将评论框移到该评论之下(jQuery版)

2022-9-11 3:48:12

下载说明

  • 1、微码盒所提供的压缩包若无特别说明,解压密码均为weimahe.com
  • 2、下载后文件若为压缩包格式,请安装7Z软件或者其它压缩软件进行解压;
  • 3、文件比较大的时候,建议使用下载工具进行下载,浏览器下载有时候会自动中断,导致下载错误;
  • 4、资源可能会由于内容问题被和谐,导致下载链接不可用,遇到此问题,请到文章页面进行反馈,以便微码盒及时进行更新;
  • 5、其他下载问题请自行搜索教程,这里不一一讲解。

站长声明

本站大部分下载资源收集于网络,只做学习和交流使用,版权归原作者所有;若为付费资源,请在下载后24小时之内自觉删除;若作商业用途,请到原网站购买;由于未及时购买和付费发生的侵权行为,与本站无关。本站发布的内容若侵犯到您的权益,请联系本站删除,我们将及时处理!
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索