【问题标题】:How to loop through CSV string data of an ACF field and print each value only once?如何遍历 ACF 字段的 CSV 字符串数据并仅打印每个值一次?
【发布时间】:2018-01-10 21:41:04
【问题描述】:

我知道如何在 PHP 中使用 echo 打印单个值,但是在以逗号分隔的数组中的每个值一次打印一个值时我被卡住了。

这就是我所拥有的:

<?php echo wp_kses_post(get_field('field')); ?>

其中field 等于预定义的单个值,例如stackof,我可以将其修改为stackof, stackog, stackoh, stackoi,... 之类的CSV 字符串。

这就是我想要的(来自 OP 的 cmets):

  1. 在管理面板上,有一个字段可以输入任何值。让我们将此值称为代码。单击按钮时,此代码直接打印在前端。
  2. 我想在单击按钮时打印唯一的预定义代码。
  3. 为此,我可以在管理面板上的字段中输入逗号分隔的代码,例如像 stackof, stackog, stackoh, stackoi,... 这样的 CSV 字符串。但它会在屏幕上打印所有代码。
  4. 单击按钮时,我需要在屏幕上一一打印每个唯一代码。此外,代码一旦打印出来,就不应再次打印。

注意:此循环与用户会话无关。因此,每次任何用户单击按钮时,都应打印 CSV 字段中的新代码,并且应将旧代码标记为已使用或丢弃。

【问题讨论】:

  • 这段代码是否在某个循环中?你怎么得到stackof, stackog, stackoh, stackoi,......
  • 嗨 @AlivetoDie,在 wp 管理面板中,我可以输入我提到的值,例如 stackof, stackog, stackoh, stackoi,......。单击按钮时将运行代码。
  • 好的,所以&lt;?php echo wp_kses_post(get_field('field')); ?&gt; 给你stackof, stackog, stackoh, stackoi,......?我对吗?如果是,您想要什么预期结果?请在您的问题中添加它
  • 您需要扩展您的问题。你到底想做什么?它是在管理员还是在前端?我们在做什么type of field字段中写入的任何值字段中的每个值是什么意思,有什么区别?
  • 我不是食人魔。改进您的问题,使其完整,联系我,我会考虑删除我的反对票。

标签: php wordpress advanced-custom-fields


【解决方案1】:

此功能应该可以帮助您获取从未打印过的最新代码。如何调用此函数完全取决于您。您可以挂钩到您的 ajax 代码或完全添加新模板。

<?php
function get_next_val_from_field( $field_name, $post_id = false ){
    // Let's get the field data as string.
    $field_data = get_field( $field_name, $post_id );

    // Did we recieved any data?
    if( ! empty( $field_data) ) {

        // Convert CSV string to an array.
        $field_data = explode( ',', $field_data );

        // Remove any empty values and trim extra spaces from around the values.
        $field_data = array_map( 'trim', array_filter( $field_data ) );

        // Rechecking if array is not empty.
        if( is_array( $field_data ) && ! empty( $field_data) ) {

            // Prefix to know next value inside the string.
            $next_value_prefix = 'mm1707_next--';

            $next_value_found = false;

            // Loop through each value to find next value, if any.
            foreach ($field_data as $key => $value) {
                if ( 0 === strpos( $value, $next_value_prefix ) ) {
                    $next_value         = str_replace( $next_value_prefix, '', $value);
                    $field_data[ $key ] = $next_value;
                    $next_value_found   = true;
                } elseif ( $next_value_found ) {
                    // Now that we have found next value let's mark following
                    // array item as next value and break the loop.
                    $field_data[ $key ] = $next_value_prefix . $value;
                    // No need for further loop now.
                    break;
                }
            }

            // If there wasn't any current value then print first value & mark next one.
            if( empty( $next_value ) ){
                $next_value = $field_data[0];
                $field_data[1] = $next_value_prefix . $field_data[0];
            }
            // Let's update the field inside DB to save currently marked data.
            update_field( $field_name, implode(',', $field_data ), $post_id );

            return $next_value;
        }
    }
}

基本上,

  1. 我们正在将 CSV 字符串转换为数组。
  2. 然后我们从带有mm1707_next--前缀的数组中找到值,
  3. 如果找到则返回它,从该值中删除前缀并用该前缀标记下一个数组值。
  4. 如果没有带有该前缀的值,那么让我们从第一个值开始。

【讨论】:

  • 谢谢。有'code1,code2,code3'作为$field_name。我希望它首先返回“code1”。但它没有返回任何内容。
  • $field_name 是 AdvanceCustomFields 字段的名称/字段键。所以使用上面的函数,比如get_next_val_from_field( 'your_acf_field_key' ); 如果它仍然没有返回任何数据,那么你没有在循环或帖子页面上使用这个函数。虽然 ACF 努力让 post_id 返回正确的数据,但它可能并非每次都可能。在这种情况下,您应该为get_field() 函数显式指定post_id 参数。
  • 它在一个帖子上。当我转换为get_next_val_from_field('your_acf_field_key' ); 时,网页返回错误并且无法打开。主题返回码时的字段名称为'coupon_code',与get_field函数配合使用。
  • 另一方面,您可以var_dumpget_field('your_acf_field_key', 'post_id'); 的返回值发回这里吗?所以我们可以看到到底返回了什么类型的数据/对象?
  • 当我用 code1、code2、code3 之类的代码填充字段时,我不使用 'like 'code1'、'code2'、'code3'。会是这个原因吗?
猜你喜欢
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 2022-12-16
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 2016-12-02
  • 1970-01-01
相关资源
最近更新 更多