WordPress ACF插件如何更改属于克隆组字段的特定字段的验证规则?

vs3odd8k  于 2023-08-03  发布在  WordPress
关注(0)|答案(3)|浏览(140)

我的克隆字段“Services”的“Fields”设置为“All fields from Section:services field group”。我的字段组”部分:services”包含几个字段,包括一个我已根据需要设置的名为“Title”的字段。
现在,在我的克隆字段“服务”,我想“标题”不需要。问题是,如果我尝试在“Section:services”中不需要它,则此更新不会扩展到“Services”克隆字段,其中“Title”仍然是必需的。
一旦字段组被克隆,是否没有任何方法可以更改克隆字段中的字段?
编辑:
我的“部分:服务”字段组,包含“标题”字段,我希望在克隆字段中更改其所需状态:


的数据
我的“服务”克隆字段包含“来自节的所有字段:服务字段组”(在此克隆字段中,我希望不再需要“标题”字段):


ux6nzvsh

ux6nzvsh1#

  • “我只想在一个特定领域这么做”*

由于您只想对特定字段应用该修改,因此需要一个unique值,通过该值可以定位该特定字段。
“ACF”为每个字段分配一个unique key,称为"Field Key"。我们可以使用这个值来定位我们想要的任何特定字段!对于任何字段,我们只需要使用Screen Options并选中Field Keys复选框即可找到此值,如以下屏幕截图所示:
x1c 0d1x的数据
现在我们可以像这样定位特定字段:

add_filter("acf/pre_render_field", "ruvee_changing_required_field", 10, 2);

function ruvee_changing_required_field($fields, $post_id)
{
    // DO NOT forget to change this value to the unique value for your field  
    if ("field_64c2e81235358" == $fields["key"]) {
        $fields["required"] = 0;
    }
    return $fields;
}  

// DO NOT forget to change this value to the unique value for your field
add_filter("acf/validate_value/key=field_64c2e81235358", "ruvee_changing_validation_rules", 10, 4);

function ruvee_changing_validation_rules($valid, $value, $field, $input)
{
    return true;
}

字符串
测试和工作在wordpress Version 6.2和ACF Version 6.1.7无缝!

回答后续关于开发环境与生产环境的问题

有多种方法可以处理这个问题。目前我能想到的两个最明显的例子如下:
1-创建"menu section/setting page",然后使用update_optionget_option函数向options table写入密钥和从options table读取密钥。

这是处理此问题的最简单、最快速且不容易混淆的方法。我会推荐这个解决方案而不是下一个!

2-使用自定义查询从数据库中获取密钥。类似这样的查询:

SELECT *
FROM `wp_postmeta` 
WHERE (CONVERT(`meta_key` USING utf8) LIKE '%title%'
AND CONVERT(`meta_value` USING utf8) LIKE '%field_%')


这个查询的结果会是这样的:



由于您的字段名称是相同的(即"Title"),这个查询可能很快变得非常棘手!
这是一个更先进的方式来处理这个问题,需要我或任何人知道你的wordpress设置,帖子类型,所有的acf字段等。
所以我对你的后续问题的回答是使用第一种解决方案。

9udxz4iz

9udxz4iz2#

您可以通过编程实现这一点。
在这个例子中,我创建了两个字段组。
一个名为Services,包含名为title的字段标题,另一个名为Clone Services,其中在Fields上,我选择了All fields from Services field group,显示:Seamless (replace this field with selected fields)并启用选项Prefix Field Names。因此,克隆组中的标题字段命名为clone_title。您可以将clonetitle部分替换为字段的实际名称。
现在,在它的简单形式中,你需要两个钩子,它们可以放置在自定义插件或活动主题的functions.php文件中。请注意,如果您没有使用子主题,当您更新主题时,这些主题将被覆盖,您需要重新应用它们。

// Removes the required indication when the field is rendered in the backend.
add_filter( 'acf/pre_render_field', function ( $field, $pid ) {
    if ( 'clone_title' === $field['name'] ) {
        $field['required'] = 0;
    }
    return $field;
}, 10, 2 );

// make the fields value to be accepted always, no matter what user actually inputed!
add_filter( 'acf/validate_value/name=clone_title', function ( $valid, 
    $value, $field, $input ) {
    return true;
}, 10, 4 );

字符串
有了这两个钩子,你可以实现你正在寻找的,但在其最简单的形式。你可以根据你的需要进一步发展这两个钩子来执行更复杂的检查和规则。
希望有帮助!

ghg1uchk

ghg1uchk3#

我通过以下两行理解了你的问题:

我的“部分:服务”字段组,包含“标题”字段,我希望在克隆字段中更改其所需状态:
我的“服务”克隆字段包含“来自节的所有字段:服务字段组”(在此克隆字段中,我希望不再需要“标题”字段):

据我了解,你要"Title" required in "Section: Services" & "Title" NOT required in "Sections" (this group has clone of 'Section: Services')

<?php
/**
 * Customize Advanced Custom Fields (ACF) field settings.
 *
 * @param array $field The field settings array.
 * @return array The modified field settings array.
 */
function acf_load_field_customization( $field ) {

    // $key_of_field_that_we_want_to_customize
    // We can use the key to customize both the clone or original field, so always work with the initial field_key.
    // Key of the "Title" field in the "Section : Services" field group.
    $title_field_key = "field_64c565905b3cd";

    // $key_of_field_that_is_cloned_of_other_field
    // Key of the "Services" field (cloned from the "Section : Services" field group).
    $services_field_key = "field_64c5660f4bc2b";

    // $key_of_field_or_group_we_clone_to_other_field
    // You use 'All fields' from XXX field group, so here use the key of that field group but If any particular field is being cloned, use its field_key here.
    // Key of the field group "Section : Services".
    $services_group_key = "group_64c5658c194e1";

    if (
        ! empty( $field['key'] )
        && isset( $field['clone'] ) && ! empty( $field['clone'] )
        && isset( $field['sub_fields'] ) && ! empty( $field['sub_fields'] )
        && $field['key'] == $services_field_key
        && in_array( $services_group_key, $field['clone'] )
    ) {
        // Loop through all cloned fields
        foreach ( $field['sub_fields'] as &$sub_field ) {
            if (
                isset( $sub_field['__key'] ) && ! empty( $sub_field['__key'] )
                && $sub_field['__key'] == $title_field_key // this means then current loop index is our cloned field of title 
            ) {
                $sub_field['required'] = 0; // Remove required from the clone of the "Title" field.
            }
        }
    }

    return $field;
}
add_filter( 'acf/load_field', 'acf_load_field_customization' );

字符串

结果

| 后| after |
| --| ------------ |
|

的|

|

我的答案是这样的->“标题”在“章节:服务”&“标题”在“节”中不需要(此组具有'节:服务)

但是替代方案采取了不同的方法。->“标题”在“部分中不需要:“节”中需要服务“&”标题”(此组具有“节:服务)

这是我脑子里最大的困惑,你问的问题是什么,所以即使我错过了理解,也许这另一种方式可以帮助别人
你的另一个后续问题
但是有一个问题是,该字段的ID在我的本地设置、暂存环境和生产环境中不会相同。有没有办法让它在任何环境下工作?
对于此在任务完成后从环境导出ACF组并在生产中导入,字段ID将相同

这是两组的数据

我删除了一些不必要的数据,以便更好地可读性



| |
| ------------ |
| ACF field setup 1 |
| ACF field setup 2 |
| ACF field setup 3 |
| Section: Services |
| Services - before |
| Services - after |

相关问题