WP получить acf поля из бд?

// Дано:
// $ACF_repeater - Поле повторитель
$ACF_repeater = $wpdb->get_results("SELECT * FROM UZ2N3VC9r8_postmeta WHERE post_id = 9 AND meta_key = 'ACF_repeater'");

//$ACF_repeater[0]->meta_value - количество иттераций

// В бд поля названы ACF_repeater_0_field ACF_repeater_1_field ACF_repeater_2_field и тд.
// Как сделать динамический meta_key?
// Вариант как сейчас написано не работает
for ($i=0; $i < $ACF_repeater[0]->meta_value; ) {
$meta_key = 'ACF_repeater_' . (string) $i . '_field';
$delivery_volume = $wpdb->get_results("SELECT * FROM UZ2N3VC9r8_postmeta WHERE post_id = 9 AND meta_key = $meta_key");

$i++
}
  • Вопрос задан
  • 519 просмотров
Решения вопроса 1
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
Выполнять отдельный SQL-запрос в каждой итерации цикла - не очень разумно и плохо для производительности. Давайте для начала получим количество элементов в рипитере:
SELECT meta_value FROM wp_postmeta WHERE post_id=83 && meta_key='recipients'

Результат:
array:1 [
  0 => [
	  'meta_value' => '3'
  ]
]

Далее, сформируем на уровне PHP массив валидных ключей:
$total = (int) $results[0]['meta_value']; // Значение в базе в string
$keys = [];

for ( $i = 0; $i < $total; $i ++ ) {
	$keys[] = "recipients_{$i}_email";
}

dump( $keys );

Результат:
array:3 [
  0 => "recipients_0_email"
  1 => "recipients_1_email"
  2 => "recipients_2_email"
]

А теперь можно одним запросом получить все значения для этих полей указав их в WHERE meta_key IN (). Получается у нас что-то типа такого:
$keys = implode(',', $keys); // собираем строку для IN
$query = "SELECT * FROM wp_postmeta WHERE post_id=83 AND meta_key IN ({$keys})";

Единственное, что PHP склеит массив в строку без кавычек, а для IN нужно чтобы значения были в кавычках. Конкретно этот запрос ошибку выдаст. Не знаю, как у вас реализовано выполнение запросов, но PDO::quote() к примеру решает данную проблему. Думаю дальше сами разберетесь.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dimovich85
@dimovich85
https://u-academy.net/
Просто get_fields($id) не пробовали? Посмотрите пример в документации.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы