当前位置: 首页 > 知识库问答 >
问题:

WP ACF从多个字段自动创建短代码

谷梁子昂
2023-03-14

目标

我目前有一个acf字段组,其中包含一些通用数据字段,如phonenumber,email等(所有简单的文本字段)。

我的目标是有一个函数可以循环所有字段,并根据它们各自的名称/标签创建一个短代码。

编辑:进度

我想我离这件事越来越近了,简化了整个事情,我相信我走在了正确的道路上。。

我将字段组附加到一个帖子,如果我这样记录它们:

$testing = get_field_objects(22);
do_action( 'php_console_log', $testing );

我得到了所有的名称、值等。在另一个代码片段的帮助下,我发现这些短代码似乎至少是动态的,因为它们都不再以某种方式显示没有值,所以都保持空白。

这就是现在的功能:

$hlfields = get_field_objects( 22 );
    foreach ( $hlfields as ['name' => $name, 'value' => $value] ) {

        ${"{$name}_fn"} = function() {
            $field = get_field($name, 22);
            return $field;
        };

        add_shortcode($name, ${"{$name}_fn"});

    }

原始尝试,不起作用且过于复杂:

我目前有一个acf字段组,其中包含一些通用数据字段,如phonenumber,email等(所有简单的文本字段)。

为了能够使用短代码轻松地插入它们,我为每个字段创建一个,如下所示:

function adresse_shortcode( $adresse ) {
    $adresse = get_field( "adresse", 'option' );
    return $adresse;
}
add_shortcode('adresse', 'adresse_shortcode');

虽然这样做很好,但我觉得我是在不必要地重复自己,而且每当我添加一个新字段时,我都需要添加一个函数。

我的目标是有一个函数可以循环所有字段,并根据它们各自的名称/标签创建一个短代码。

我发现此代码段用于按ID获取字段组的所有字段:

function get_specifications_fields() {

    global $post;

    $specifications_group_id = 13; // Post ID of the specifications field group.
    $specifications_fields = array();

    $fields = acf_get_fields( $specifications_group_id );

    foreach ( $fields as $field ) {
        $field_value = get_field( $field['name'] );

        if ( $field_value && !empty( $field_value ) ) {
            $specifications_fields[$field['name']] = $field;
            $specifications_fields[$field['name']]['value'] = $field_value;
        }
    }

    return $specifications_fields;

}

但我现在不知道如何创建短代码,我一直在尝试所有我能想到的方法:

function adresse_shortcode( $value ) {
    $specifications_fields = get_specifications_fields();
    foreach ( $specifications_fields as $name => $field ) {
        $value = $field['value'];
        $label = $field['label'];
        $name = $field['name'];
        return $name;
    }
    add_shortcode($value, 'adresse_shortcode');
}

我对PHP不是很精通,所以我确信这是各种各样的错误,但我已经尝试了几个小时,希望有人能给我指出正确的方向。

共有1个答案

俞俊逸
2023-03-14

这里有一个使用匿名函数的例子,应该可以做到这一点

$hlfields = get_field_objects( 22 );
foreach ( $hlfields as ['name' => $name, 'value' => $value] ) {

    $cb = function() use ($name) {
        $field = get_field($name, 22);
        return $field;
    };  

    add_shortcode( $name, $cb );

}

以下是我在回答时提到的源代码:php中的动态函数名、WordPress中的动态短代码和函数、php:变量函数

 类似资料:
  • MarkLogic 9.0.8.2 在开发环境中,我们逐个创建了5个字段(Field1、Field2、Field3、Field4、Field5),即每个索引需要大约20个小时来19M记录,搜索工作正常。 对于系统测试环境,我们以相同的顺序一次创建了5个字段,MarkLogic花了大约3天的时间完成了对19M条记录的索引。 但搜索只对Field1有效,对其他字段无效。我们尝试了一切,但都没有成功,然

  • 我知道,如果没有给出ObjectID,Mongoose会自动用ObjectID填充_id字段,并且在构造模型和实例时可以覆盖_id。 猫鼬3.0.x 让我们把这个说得更具体些。想象一个,我想通过删除标题来创建漂亮的URL。为了将slug映射到Mongo对象,我对slug进行散列,并将其转换为以利用它的优点。现在,我正在寻找一个透明的方法,它允许我只通过传入来创建的实例,并自动生成和属性。

  • 在创建新的字段类型之前,请考虑其他自定义字段的方法是否适合您的需求。 如果您的应用程序需要存储新的值类型,或者希望为现有的值类型创建新的UI,则可能需要创建一个新的字段类型。 要创建一个新字段,请执行以下操作: 实现一个构造函数 注册一个JSON密钥并实现fromJson 处理块上UI和事件侦听器的初始化 处理事件侦听器(已为您进行了UI处理) 实现值处理 添加字段值的文本表示形式,以实现可访问性

  • 通过“自定义字段”方法创建数据后,数据里没有任何记录,需要到地图编辑模块添加数据。新建数据时,请注意选择到数据类型(点线面),创建完成后不可以修改。 选择通过自定义字段创建,需要手动输入属性列,并选择好属性列的类型,如文本/数值等。其中数值列可以用于统计。

  • 我需要在Cms后端表单(fields.yaml)中创建一个多选表单字段。我采用了以下方法 选择_字段: 此字段的选项将从模型中调用 一切正常,但当我提交表单时,只有第一个选择的选项作为JSON数据插入到数据库表文本字段中。我希望存储每个选定的选项。我也在模型中声明该字段为Jsonable,即受保护的$Jsonable=['field_name']; 注意:当我使用类型作为检查框列表时,它像我想的那

  • 我使用自定义短代码来显示我的内容内的引导模式。问题是,