WordPress:在ACF(高级张贴字段)插件中获得选择字段选项吗? - php

我现在在wordpress中使用高级自定义字段插件。
现在,我定义了一些选择,它们的选择如下所示:

字段名称:time_availability
字段类型:选择

low : Once or twice
high : Several times

因此,我想在页面代码中枚举这些设置,例如渲染:

<ul>
  <li><input type="radio" name="low" /> Once or twice</li>
  <li><input type="radio" name="high" /> Several times</li>
</ul>

如何获得选择?

更新:
似乎调用get_field_object($field_name)是否可以获得整个字段设置,包括选择。
但是,当我使用字段名称调用该函数时,将返回以下内容:

array(18) {
  ["key"]=>
  string(33) "field_time_availability"
  ["label"]=>
  string(0) ""
  ["name"]=>
  string(27) "time_availability"
  ["_name"]=>
  string(27) "time_availability"
  ["type"]=>
  string(4) "text"
  ["order_no"]=>
  int(1)
  ["instructions"]=>
  string(0) ""
  ["required"]=>
  int(0)
  ["id"]=>
  string(37) "acf-field-time_availability"
  ["class"]=>
  string(4) "text"
  ["conditional_logic"]=>
  array(3) {
    ["status"]=>
    int(0)
    ["allorany"]=>
    string(3) "all"
    ["rules"]=>
    int(0)
  }
  ["default_value"]=>
  string(0) ""
  ["formatting"]=>
  string(4) "html"
  ["maxlength"]=>
  string(0) ""
  ["placeholder"]=>
  string(0) ""
  ["prepend"]=>
  string(0) ""
  ["append"]=>
  string(0) ""
  ["value"]=>
  bool(false)
}

不是预期的结果。
而如果我使用原始字段名称调用该函数:

get_field_object('field_55df081515e81');

没错!
怎么了?有什么区别?如何使用field_name正确处理?

参考方案

最终,毕竟,我找到了解决此问题的可靠解决方案:

您首先可以在源代码中看到api_acf_load_field函数:

add_filter('acf/load_field', 'api_acf_load_field', 1, 2);
function api_acf_load_field( $field, $field_key )
{
    // validate
    if( !empty($GLOBALS['acf_register_field_group']) )
    {
        foreach( $GLOBALS['acf_register_field_group'] as $acf )
        {
            if( !empty($acf['fields']) )
            {
                foreach( $acf['fields'] as $f )
                {
                    var_dump($f['key']);
                    if( $f['key'] == $field_key )
                    {
                        $field = $f;
                        break;
                    }
                }
            }
        }
    }

    return $field;
}

我们可以遍历所有注册字段以选择正确的字段。

但是$GLOBALS['acf_register_field_group']仅在我们显式调用register_field_group时才存在(下面的情况2)。或在正常情况下(以下情况1),我们无法采用这种方式。

因此,请查看不同的情况:

情况1:在管理面板(在数据库中)中定义了字段组时:

function get_field_choices($field_name, $multi=false) {
    $results = array();
    foreach (get_posts(array('post_type' => 'acf', 'posts_per_page' => -1)) as $acf) {
        $meta = get_post_meta($acf->ID);
        foreach($meta as $key => $field) {
            if(substr($key, 0, 6) == 'field_') {
                $field = unserialize($field[0]);
                if($field['name'] == $field_name && isset($field['choices'])) {
                    if(!$multi) return $field['choices'];
                    else $results []= $field;
                }
            }
        }
    }
    return $results;
}

在这种情况下,字段组存储为帖子类型为acf的帖子,字段信息存储为该字段组的post_meta

因此,我们将从数据库中获取所有注册的字段,然后选择正确的字段。

情况2:显式register_field_group时,例如在functions.php中使用导出php脚本:

function get_field_choices($field_name, $multi=false) {
    $results = array();    $results = array();
    foreach($GLOBALS['acf_register_field_group'] as $acf) {
        foreach($acf['fields'] as $field) {
            if(substr($field['key'], 0, 6) == 'field_') {
                if($field['name'] == $field_name && isset($field['choices'])) {
                    if(!$multi) return $field['choices'];
                    else $results []= $field;
                }
            }

        }
    }
    return $results;
}

然后,我们终于有了一个始终工作的函数:

function get_field_choices($field_name, $multi=false) {
    $results = array();
    foreach($GLOBALS['acf_register_field_group'] as $acf) {
        foreach($acf['fields'] as $field) {
            if(substr($field['key'], 0, 6) == 'field_') {
                if($field['name'] == $field_name && isset($field['choices'])) {
                    if(!$multi) return $field['choices'];
                    else $results []= $field;
                }
            }

        }
    }
    foreach (get_posts(array('post_type' => 'acf', 'posts_per_page' => -1)) as $acf) {
        $meta = get_post_meta($acf->ID);
        foreach($meta as $key => $field) {
            if(substr($key, 0, 6) == 'field_') {
                $field = unserialize($field[0]);
                if($field['name'] == $field_name && isset($field['choices'])) {
                    if(!$multi) return $field['choices'];
                    else $results []= $field;
                }
            }
        }
    }
    return $results;
}

WordPress:在网站上仅加载一个jquery脚本 - php

刚要启动一个WordPress网站,但注意到它当前正在加载两个jquery文件,一个包含在wp-includes中,另一个来自我的header.php,是否有一种方法可以使wordpress在前端加载wp-includes?做了大量的搜索,并且对此的唯一提及似乎包括以下代码,但是我找不到关于它的任何文档,任何想法?<?php wp_enqueue_sc…

“×”乘法符号替换URL中的&timestamp - php

我对从GoCardless PHP库生成的链接有问题。我使用的是WordPress,我发现文件/wp-includes/formatting.php具有函数"ent2ncr",该函数将"&times"替换为乘号"&#215",并且以某种神奇的方式,该函数(可能是我错了)将...&am…

为什么函数执行后无法获取数组键值? - php

我称这个WordPress功能为:get_user_meta($user->ID, "user_address"); 它返回数组,我不想将其放入变量,而只是将其回显。但这不起作用:get_user_meta($user->ID, "user_address")[0]; 为什么?有什么办法做到这一点吗? 参考…

如何从php中获取datatables jQuery插件的json数据 - php

我是PHP的新手,正在尝试使用Datatables jQuery插件。我知道我必须从.php文件中获取数据,然后在数据表中使用它,但是我似乎无法通过ajax将其传递给数据表。我设法从数据库中获取数据,并对其进行json编码,但是后来我不知道如何在我的index.php文件中调用它,并在其中显示它。我究竟做错了什么?这是我的代码:HTML(已编辑): <…

PHP Count数组元素 - php

嗨,有人可以解释为什么这会返回“数组由0个元素组成”。 :$arr = array(1,3,5); $count = count($arr); if ($count = 0) { echo "An array is empty."; } else { echo "An array has $count elements.…