WordPress6.3的一些问题和困扰的故事

問題:在更新WordPress后,短代码无法使用。

「听说啊,网站上显示了一些我听不懂的英文呢。」看了一下,发现原始的短代码没有执行而直接输出了出来。

这个不行的东西。

根据经验,这类问题通常源于WordPress的规格变更等原因,往往需要进行较大幅度的修正,甚至在某些情况下可能无法实质性地解决。

原因:由于使用了块级主题,裸露的短代码无法正常运行。

即使使用相同的短代码,在非块状主题的网站上可以正常运行,在块状主题的网站上尚未进行WordPress更新的网站也可以正常工作,看起来似乎是由于WordPress块状主题的规范变更所致。
即使是一些无法使用的短代码的网站,也有一些地方可以正常工作,差异似乎在于是否直接在模板编辑器中设置的块。

回答:对应:模板是根据将模板部件组合起来进行编辑的规则。

根据调查,解除封装的短代码在模板编辑器中被禁止运行是出于安全上的考虑,强行将其激活似乎不太好。

通过将裸露在模板编辑器中的块放入模板部件中,可以使短代码运行。在模板编辑时,首先创建模板部件,并确保遵守将其组合以创建模板的规则,以解决短代码无法执行的问题。

就在我以为的时候。

问题:还有一个不起作用的短代码。

暫時感到放心,至少成功執行了短碼,但馬上又出現了意料之外的輸出問題,有些輸出沒有顯示,還有一些根本沒有執行。看起來使用了伺服器端渲染或依賴於循環上下文的短碼似乎無法運作。

原因:在区块主题中,do_shortcode的执行会在do_blocks之后进行。

在块主题中,do_shortcode将在do_blocks之前执行。这意味着,块虽然在render_callback中输出短代码,但不会被执行,而render_callback接收的内容则是已经执行了短代码的。

	$content = $wp_embed->run_shortcode( $_wp_current_template_content );
	$content = $wp_embed->autoembed( $content );
	$content = do_blocks( $content );
	$content = wptexturize( $content );
	$content = convert_smilies( $content );
	$content = shortcode_unautop( $content );
	$content = wp_filter_content_tags( $content, 'template' );
	$content = do_shortcode( $content );
	$content = str_replace( ']]>', ']]>', $content );

参考:获取区块模板的HTML代码

如果不是块主题,那么在do_blocks结束后应用的the_content过滤钩子的do_shortcode会被一起执行。因此,可以使用render_callback编写循环来执行内容中的短代码,并在执行过程中更改全局变量,或者输出短代码,并在父块的上下文中执行它。但现在无法做到这一点。

解决方案:将独立于WordPress的独特短代码进行处理。

とりあえず、原因特定まではそれほど時間が掛からなかったが、これはWordPressの処理を読み直さなければ適切に対処ができない、時間がかかる問題だということも同時にわかった。
なので一旦は応急処置でrender_callbackとショートコードを組み合わせて使わないブロックに置き換えた。見た目が少し変わってしまったところもあるものの、内容としては同じものが表示されている状態までは復旧できた。
表向きは問題は解決したわけが、ここからが本番。

フィルタフックでどうにかできないものかと、ブロックテーマでコンテンツがどのように出力されているのかWordPressのコードを追ってみたがこれはどうにもなりそうになかった、そもそもフィルタフックがほとんどなかった。

独自ショートコードの登録を遅らせるなども試みたが、ショートコードを実行したいタイミングの後でまたショートコードを実行したくないタイミングがあったりして断念した。

結局、独自ショートコードをWordPressのショートコードとして登録することはせず、独自ショートコードの実行を自前で実装してcore/template-part及びthe_contentのフィルタフックで処理するというおよそ力技な方法で対処した。
実のところ、hrefとかclassとかでショートコードが使えるようにhtmlの属性値内のショートコードを実行したい需要もあったので丁度良かった。

まとめ

对于WordPress 6.3版本中关于区块主题的短代码处理方式的改变,如果涉及到区块的render_callback中的输入输出问题,似乎没有简单的解决方法。

广告
将在 10 秒后关闭
bannerAds