如何避免 Wordpress 主题升级更改我的父主题 functions.php?

How can I avoid Wordpress theme upgrades changing my parent themes functions.php?

我目前在 wp-content/themes/genesis/header.php

中手动实施了跟踪代码

代码如下所示(缩写):

<script>
  CODE HERE
<?php if (is_single()){CODE HERE}?>
  CODE HERE
</script>
</head>

每当我升级 genesis(Wordpress 主题)时,此代码都会丢失,我必须再次手动添加它。

如何通过 functions.php 将这段代码添加到 wp-content/themes/genesis/header.php 的头部部分,以便它在 Wordpress 主题升级后仍然存在 - 代码看起来如何?

通常,修改主题而不覆盖您的修改的解决方案是使用 child 主题。但是您也可以创建一个小插件,它可以做您在这里想做的同样的事情。

你选择哪个选项一般来说现在很多,但如果你计划在未来进行更多更改,你应该记住:

  • 插件用于添加功能
  • 主题用于控制事物的外观和感觉

这可能会帮助您决定现在最好选择哪个选项(尽管您可以轻松地同时执行这两个选项,或者如果您愿意,稍后可以更改:))。

选项 1:创建 child 主题

wp-content/themes 文件夹中创建一个新文件夹(将其命名为您喜欢的新主题),然后在该文件夹中创建一个 style.css

style.css 的顶部,您需要包含主题的定义信息。您可以从 Genesis 主题复制此格式,只需更改名称和其他详细信息,以便在您激活它时清楚这是您的主题。

这里的关键是在这个主题信息中添加一个新行阅读:

Template: genesis

该行告诉 Wordpress,您的主题将是 Genesis 的 child 主题,您的主题未提供的任何内容,Wordpress 将从 Genesis 获取。

这里的关键是只覆盖你想要的,让其余的回退到 Genesis。

因此,您 可以 复制 header.php 并添加您的代码,但是如果文件发生变化,您仍然需要更新文件的其余部分。更好的解决方案是在新的 child 主题中创建自己的 functions.php 并使用以下内容:

add_action('wp_head', function(){
  ?>
  Enter tracking code here...
  <?php
});

这将连接到 Wordpress 的 head 操作,并在您需要的地方打印出跟踪代码,而无需处理 header 的其余部分。

当然,一旦您准备就绪,请转到 Wordpress 中的外观 -> 主题,您会在那里看到您的新主题。激活它并检查您的网站!

有关 child 主题的更多背景和提示,您可以查看 this page on the Wordpress Codex

选项 2:创建插件

如果您只是想添加到站点的功能,您可能会发现插件更有用 - 特别是因为您可以稍后更改主题并轻松保留您的插件,并且您可以随意激活和停用它。

如果您想稍后添加更多功能,您可以创建任意数量的插件。

这个过程相当类似于上面创建主题。不要在 wp-content/themes 文件夹中创建新文件夹,而是将其粘贴在 wp-content/plugins 中。然后,在该文件夹中创建一个 .php 文件(例如 myplugin.php,但您可以随意命名),并在文件顶部添加以下内容:

<?php
/*
Plugin Name: My Toolset
*/

(您可以根据需要添加其他信息,更多信息可在 this page of the Wordpress Plugin Handbook 上找到)

在此之下,只需放置与上面主题选项中提到的完全相同的 add_action() 代码。

保存您的文件,转到您的 Wordpress 管理员中的插件,在列表中找到您的新插件,单击激活,然后检查您的站点!

有关插件的更多背景和提示,您可以查看 this page on the Wordpress Codex

您需要使用 wp_head 挂钩将内容动态添加到 <head></head>

您的代码如下所示:

add_action('wp_head', 'change_this_name');
function change_this_name(){
  ?>
  <script>
    CODE HERE
  <?php if (is_single()){CODE HERE}?>
    CODE HERE
  </script>
  <?php
};