我做了很多page.php
使用ACF中继器和灵活的内容模块(1000多行代码)。代码越来越像意大利面条,我不知道如何构造它,以便更易于阅读和维护。
以下是它的伪代码版本:
$all_fields = get_fields();
foreach( $all_fields as $field ):
if( $field == \'field_1\' ):
// Deal with field_1
elseif( $field == \'field_2\' ):
// Deal with field_2
elseif( $field == \'field_3\' ):
// Deal with field_3
...
... etc.
... etc.
endif;
endforeach;
现在,我面临着一个挑战,这将要求我更好地构建代码;我需要另一个页面模板(
page-foobar.php
), 其中包括如上所示的相同ACF代码。
一方面,我想把整个东西做成一个(或几个)函数,然后把它放进去functions.php
. 但我正在污染functions.php
-文件,这会很糟糕。
理想情况下,如果我正在做的事情有这样的事情,我会用“WordPress方式”来做,但我还没有听说过这样的事情。因此,如果没有,那么我希望在我的主题中有一个名为“acf模块”的文件夹,然后每个字段都有一个文件,其中包含如下函数:
function field_1( $field_information ){
// Deal with $field_information
}
但我应该在
functions.php
, 在WordPress上要求每个文件\'
init
-钩这真的是最干净/最好的方法吗?
最合适的回答,由SO网友:cjbj 整理而成
嗯,结构化在一定程度上是一个品味问题,但在这种情况下,将所有函数包含在一个单独的文件中似乎是一个好主意。这包括两个模板文件中的代码。而不是elseif
你可以使用PHP\'s switch statement. 因此,您可以:
在您的functions.php
(只是普通的,不依赖于挂钩)
require_once (get_template_directory() . \'/field-functions.php\');
在模板文件中
deal_with_fields ();
在您的
field-functions.php
function deal_with_fields () {
$all_fields = get_fields ();
foreach ($all_fields as $field) {
switch ($field) {
case \'field_1\' : deal_with_field_1 ($field); break;
case \'field_2\' : deal_with_field_2 ($field); break;
....
}
}
}
function deal_with_field_1 ($field) {
do your thing;
}
function deal_with_field_2 ($field) ....
SO网友:Zeth
我又遇到了同样的问题。上次,我用@cjbj的答案解决了这个问题。这次我做了一些更聪明、更容易处理的事情。
cjbj的回答的缺点是,如果需要渲染的文件,那么函数deal_with_field_1
和deal_with_field_2
实际上不起作用(除非你在其中包含了一些东西或echo file_get_contents(...)
.
这次我做的是在我的functions.php
然后将所有部分分别保存在主题的文件夹中。
开关功能如下所示:
function custom_acf_sections( $acf_sections ){
foreach( $acf_sections as $section ){
switch( $section[\'acf_fc_layout\'] ){
case "section_1":
include( $_SERVER[\'DOCUMENT_ROOT\'] . \'/wp-content/themes/THEMENAME/acf-sections/section_1.php\' );
break;
case "section_2":
include( $_SERVER[\'DOCUMENT_ROOT\'] . \'/wp-content/themes/THEMENAME/acf-sections/section_2.php\' );
break;
case "section_3":
include( $_SERVER[\'DOCUMENT_ROOT\'] . \'/wp-content/themes/THEMENAME/acf-sections/section_3.php\' );
break;
}
}
}
这几乎和@cjbj的答案一样,-但直到我第二次遇到同样的问题,我才弄明白。所以我想我会分享我的解决方案。