两个不同页面上的相同ACF

时间:2018-11-03 作者:Zeth

我做了很多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-钩这真的是最干净/最好的方法吗?

2 个回复
最合适的回答,由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_1deal_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的答案一样,-但直到我第二次遇到同样的问题,我才弄明白。所以我想我会分享我的解决方案。

结束

相关推荐

两个不同页面上的相同ACF - 小码农CODE - 行之有效找到问题解决它

两个不同页面上的相同ACF

时间:2018-11-03 作者:Zeth

我做了很多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-钩这真的是最干净/最好的方法吗?

2 个回复
最合适的回答,由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_1deal_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的答案一样,-但直到我第二次遇到同样的问题,我才弄明白。所以我想我会分享我的解决方案。

相关推荐