Поле ACF Repeater возвращает строку, содержащую количество репитеров - PullRequest
0 голосов
/ 02 марта 2020

Когда я использую get_field('repeater_name'), он возвращает строку, содержащую число, которое является счетчиком ретранслятора, в то время как он должен возвращать массив подполей, ранее об этой проблеме неоднократно сообщалось, но ни одно из них не обеспечивало стабильного исправления. к этому единственный способ - отредактировать сообщение и нажать кнопку обновления, и он будет заново генерировать поля повторителя, но в моем случае у меня есть 19 тысяч сообщений, и редактировать каждое сообщение невозможно.

Также have_rows('repeater_name') возвращает false, как и ожидалось, и данные реального поля (get_post_meta($post_id, "field_{$field_key}", true) возвращает NULL

. Буду признателен за любую помощь или любой автоматический скрипт, который генерирует ключи поля повторителя и заполняет значения всех сообщений.

Об этой проблеме ранее сообщалось в здесь , здесь и здесь , и ни одна не была исправлена.

РЕДАКТИРОВАТЬ: Я обнаружил проблему, проблема в wp_postmeta таблице, неправильные ключи поля хранятся:

wp_postmeta table

| meta_key                | meta_value    | 
| -------------           |:-------------:|
| _repeater_name          | field_XXXXXXX |
| _repeater_0_subfield    | field_ABCDEFG |
| _repeater_0_subfield2   | field_HIJKLMN |

Те же ключи поля должно совпадать в wp_posts т в состоянии, но это не так (возможно, из-за переноса данных или по любой другой причине):

| post_excerpt   | post_name     | post_type | 
| ---------------| ------------- |-----------|
| repeater_name  | field_YYYYYYY | acf-field |
| subfield       | field_BBBBBBB | acf-field |
| subfield2      | field_CCCCCCC | acf-field |

Я думаю, если есть способ синхронизировать c ключи полей в базе данных, это решит проблему

1 Ответ

2 голосов
/ 13 марта 2020

Я сделал решение для этого, возможно, не точное решение для этой проблемы, но это сработало для меня, сначала я каким-то образом вернул свои поля к версии, которая работала примерно на 60% полей, а для остальных я написал эта обратная совместимость:

function dw_build_repeater($name, $keys = [], $post = null) {
    $post = get_post($post);

    $repeater = get_field($name, $post->ID);

    if (! $repeater || is_array($repeater) || ! is_numeric($repeater)) {
        return;

    }

    $arr = [];

    for ($i = 0; $i < (int) $repeater; $i++) {

        foreach ($keys as $key) {
            $arr[$i][$key] = get_post_meta($post->ID, $name . "_" . $i . "_{$key}");
        }
    }

    update_field($name, $arr, $post->ID);

    return $arr;
}

, поэтому всякий раз, когда я хочу вызвать ретранслятор, я просто делаю это:

if (have_rows('repeater_name') || dw_build_repeater('repeater_name', ['subfield1', 'subfield2', 'subfield3']) {
     while (have_rows('repeater_name')) {
          the_row();
          // And the rest
     }

}

Я не тестировал его с вложенными ретрансляторами, но я полагаю, что это может и не произойти. работать с вложенными повторителями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...