Объединить несколько переменных ACF в один массив - PullRequest
0 голосов
/ 27 августа 2018

Я использую поля отношений ACF. Я показываю несколько блоков, выбранных вручную. Есть последний блок постов, где я хочу исключить все выбранные рукой ранее.

Как мне сделать массив всех ACF, чтобы выбрать их, чтобы исключить их из цикла?

Это мой код (не работает, он работает, если я использую только одну переменную)

<?php   
$excluir = get_field('bloque_6_posts');
$excluir2 = get_field('bloque_2_posts');
$excluir3 = get_field('post_destacado');
$excluir4 = get_field('posts_destacados');
$excluir5 = get_field('bloque_4_posts');
$excluirtodo = array (
  $excluir,
  $excluir2,
  $excluir3,
  $excluir4,
  $excluir5
);
$paged = (get_query_var('page')) ? get_query_var('page') : 1;
$args = array(
  'posts_per_page' => 9,
  'paged'          => $paged,
  'post__not_in' => $excluirtodo
);

$the_query = new WP_Query( $args ); 
?>

РЕДАКТИРОВАТЬ [решено]: как @disinfor указал на комментарии, решение было array_merge вместо массива

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Мне кажется плохим методом вызывать 5 полей ACF, а затем объединять их в массив во время создания страницы.
Для меня этот метод лучше:
1. Создайте текстовое поле AСF - hide_excluir
2. Добавьте фильтр в functions.php (При редактировании нашей страницы все поля ACF с исключениями будут объединены в массив и сохранены в поле, которое мы создали ранее).

add_filter('acf/save_post', 'excluir_post_filter', 20);
function excluir_post_filter($post_id) {

    if ( $post_id != 2 ) //Change to your page ID (or if you need use post type or page template, need modify)
        return;

    $excluir = get_field('bloque_6_posts');
    $excluir2 = get_field('bloque_2_posts');
    $excluir3 = get_field('post_destacado');
    $excluir4 = get_field('posts_destacados');
    $excluir5 = get_field('bloque_4_posts');

    $all_excluir = array_merge(
        $excluir,
        $excluir2,
        $excluir3,
        $excluir4,
        $excluir5
    );

    update_post_meta($post_id, 'hide_excluir', $all_excluir ); //Save array to our field

}

3. Мы используем наше поле с get_post_meta

$paged = (get_query_var('page')) ? get_query_var('page') : 1;
$args = array(
  'posts_per_page' => 9,
  'paged'          => $paged,
  'post__not_in' => get_post_meta( $post->ID, 'hide_excluir', true ) //Get our field with post array
);

$the_query = new WP_Query( $args );

Для методов тестирования вы можете установить плагин Query Monitor и увидеть разницу в количестве запросов к базе данных.

0 голосов
/ 28 августа 2018

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

В настоящее время вы передаете массив массивов в post__not_in. Вам необходимо использовать array_merge для объединения массивов в один массив.

<?php   
$excluir = get_field('bloque_6_posts');
$excluir2 = get_field('bloque_2_posts');
$excluir3 = get_field('post_destacado');
$excluir4 = get_field('posts_destacados');
$excluir5 = get_field('bloque_4_posts');

// NEW CODE HERE
$excluirtodo = array_merge(
  $excluir,
  $excluir2,
  $excluir3,
  $excluir4,
  $excluir5
);
// END ARRAY_MERGE
$paged = (get_query_var('page')) ? get_query_var('page') : 1;
$args = array(
  'posts_per_page' => 9,
  'paged'          => $paged,
  'post__not_in' => $excluirtodo
);

$the_query = new WP_Query( $args ); 
?>
...