更新时间:
我创建了一个全新的WordPress安装,复制了基本和基本子主题,并激活了基本子主题。外观/自定义显示与下面第1点所述相同的白色屏幕。
然后我激活了Base,并且外观/自定义屏幕出现了相同的错误,这在之前的WP安装中没有发生。这让我相信我的定制程序代码有问题。我会追根究底的。
我开发了一个自定义主题,我们称之为;“基本”;,基于https://underscores.me/, 这是其他几个儿童主题的样板。基本主题具有几个可通过主题定制器访问的主题mod。我还创作了一个儿童主题Base,即“a.K.a.”;基本子项“;,现在只包含样式。css文件,复制如下:
/*
Theme Name: Base Child
Template: base
Theme URI: https://blabla.com/
Author: Me
Author URI: https://blabla.com/
Description: Base Child
Version: 1.0.0
Text Domain: base-child
Tags: custom-background, custom-logo, custom-menu, featured-images, threaded-comments, translation-ready
*/
只安装了以下插件:
ACF照片库字段(免费版)高级自定义字段(免费版)
简单的页面排序当基本主题被激活时,一切正常,这意味着所有自定义帖子类型都存在,主题定制器工作完美,所有短代码的行为都像它们应该的那样,等等。从现在起,事情会变得很混乱,所以请对我耐心点。一旦我激活了Base Child,奇怪的事情就开始发生了:
如果我进入“外观/自定义”,屏幕上只显示;您正在自定义站点名称;消息,页面标题为;自定义:正在加载"E;永远其他方法都不起作用与第1点相关,控制台检查显示页面上存在此JS错误:Uncaught SyntaxError: Unexpected token \'<\' on customize.php on line 5240
, 在查看页面源代码时,我发现了一个php错误:Warning: sprintf(): Too few arguments in C:\\wamp64\\www\\base-boilerplate\\wp-includes\\theme.php on line <i>1027</i>
为了用另一个主题复制这个问题,我安装了二十个二十岁的孩子,并在其style.css
. 我很惊讶地看到,所有在Base中创建的自定义帖子类型都以二十个孩子的身份出现在Base Child中。关于外观/自定义,我得到了与第1点相同的行为。这就好像卑鄙的孩子还是卑鄙的孩子一样清除浏览器缓存对第3点没有影响在以前未使用过的另一个浏览器中打开WP Admin对第3点没有影响激活二十岁,然后激活基础儿童(仍然是二十岁的孩子),使基础儿童表现得像一个真正的二十岁的孩子。不再像预期的那样自定义帖子类型和外观/自定义。此时,基本子级被激活在其style.css
. 转到浏览器,看起来Base Child仍然是二十岁的孩子。无自定义帖子类型,无外观/自定义问题激活Base,然后作为Base的子级激活Base子级:Base的CPT出现,外观/自定义停止工作,如第1点所述我很困惑。到处找,什么都试过,什么都没用。WP似乎有自己的缓存,可能与数据库相关,否则我无法解释为什么在切换主题时CPT会保留下来。它与浏览器缓存无关。
请帮忙。
最合适的回答,由SO网友:George 整理而成
我找到了罪犯。
我的定制程序代码中有几个主题mod,其中一个是页脚文本,其中包含一些;“变量”;喜欢%year%
和%site%
在默认值中,将替换为前端中的实际值。只要我用{{year}}
和{{site}}
事情开始正常运转。
回顾一下sprintf()
收到PHP警告,使用%
这个标志造成了混乱,尤其是%site%
以a开头%s
, 已传递给sprintf()
正如雅各布所提到的:
如果修改名称不存在,那么$default将通过sprintf()PHP函数传递,模板目录URI作为第一个字符串,样式表目录URI作为第二个字符串。
所以sprintf()
收到额外的%s
, 没有预期的参数。警告是在内联JavaScript中生成的,因此破坏了语法。
因此,如果要在中使用变量或文本占位符$default
主题mod的值,避免使用%
作为分隔符。。。
SO网友:Jacob Peattie
在WordPress中,当前主题和父主题存储在数据库中,作为template
(父主题)和stylesheet
(子主题)中的选项wp_options
. 当您根据已激活主题的目录名激活主题时,会设置这些名称Template:
主题样式的标题。css(如果存在)。
这些选项用于确定从哪个目录加载文件,例如函数。php和加载的任何文件get_template_directory_uri()
等
由于父主题是在激活子主题时设置的,因此如果您试图通过编辑子主题的样式来更改父主题。css激活后,父主题将不会更改,因为数据库仍然具有旧值。您需要停用并重新激活主题,以便识别对父主题的任何更改。
这涵盖了第3-8点。关于第2点中的错误,JS错误几乎肯定是由PHP错误引起的。根据行号判断,PHP错误似乎是由使用get_theme_mod()
默认值(第二个参数)包含%s
在它的某个地方。如果存在,则将其视为sprintf字符串,并出于某种原因传递父主题和子主题URI。看来如果太多%s
如果存在,这将抛出您看到的错误。文档中的这一行可能提供了线索:
如果修改名称不存在,那么将传递$默认值sprintf() PHP函数,模板目录URI为第一个字符串,样式表目录URI为第二个字符串。
老实说,我完全不知道这到底是为了什么,也找不到任何关于这种行为的提及或讨论。