Skip to content

Instantly share code, notes, and snippets.

@campusboy87
Last active September 13, 2022 01:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save campusboy87/9a45e65bcd28d8521ca2a2552553e6aa to your computer and use it in GitHub Desktop.
Save campusboy87/9a45e65bcd28d8521ca2a2552553e6aa to your computer and use it in GitHub Desktop.
Функция для получения значения repeat acf поля с учётом пагинации.
<?php
/**
* Получает значения repeat acf поля с учётом пагинации.
*
* todo:
* 1) Кеширование
* 2) Соответствие имен вложенных полей с настройками repeat поля.
* 3) Учитывать вложенные repeat/группы поля.
*
* @param int $post_id ID записи.
* @param string $key Ключ поля, например my_field.
* @param int $rows Сколько элементов надо получить.
* @param int $paged Страница пагинации.
*
* @return array
*/
function get_repeat_field_by_pagination( $post_id, $key, $rows = 5, $paged = 1 ) {
global $wpdb;
$start = $rows * $paged - $rows;
$end = $rows * $paged - 1;
$beetween = implode( '|', range( $start, $end ) );
$regexp = "'^$key\_($beetween)\_'";
$result = $wpdb->get_results( "
SELECT meta_key as name, meta_value as val
FROM $wpdb->postmeta
WHERE post_id=$post_id AND wp_postmeta.meta_key REGEXP $regexp
" );
$groups = [];
foreach ( $result as $row ) {
preg_match_all( $regexp, $row->name, $matches );
$base_key = $matches[0][0];
$sub_key = explode( $base_key, $row->name )[1];
if ( isset( $groups[ $base_key ] ) ) {
$groups[ $base_key ][ $sub_key ] = $row->val;
} else {
$groups[ $base_key ] = [ $sub_key => $row->val ];
}
}
return array_values( $groups );
}
// Пример вызова
get_repeat_field_by_pagination( 357, 'repeat_field', 2, 6 )
@campusboy87
Copy link
Author

Поле на странице редактирования группы полей

image

Поле на странице редактирования записи

image

Пример хранения данных такого поля в базе данных

image

Пример полученных данных при get_repeat_field_by_pagination( 357, 'repeat_field', 2, 6 )

Array
(
    [0] => Array
        (
            [title] => Текст 11
            [desc] => Описание
        )

    [1] => Array
        (
            [title] => Текст 12
            [desc] => Описание
        )
)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment