Ivseti
@Ivseti
Фронтенд HTML, CSS и немного JS с PHP

Как в массив добавить функцию для загрузки элементов через ajax?

Работаю с WP, возникла необходимость подгружать карточки игр при нажатии кнопки "показать все". Данные передаю стандартные и из ACF полей. Проблема возникла с передачей данных из галереи ACF. Я написал функцию, которая отлично работает и выдает нужные данные для data-gallery. Но не получается вывести в массив $json['results'][] = array эту функцию, точнее не пойму какой должен быть синтаксис и куда саму функцию в коде поставить. Пробовал разные варианты вывода в $json['results'][] = array, к примеру так:

'gameGallery' => gameGallery(),

и как вариант пробовал запихнуть функцию в переменную и добавить ее в массив. Подскажите вообщем:)

Функция которая выводит галерею, которую нужно добавить в $json['results'][] = array :

function gameGallery() { 
  $images = get_field('gallery_game_img');

  $i = 0;
  if($images) { 
    foreach( $images as $image ) {
      $numItems = count($images);
      if(++$i === $numItems) {
        echo """ . esc_url($image['url']) . """;
      } else {
        echo """ . esc_url($image['url']) . "",";
      }

    }
    
  }
}


Функция основная в function.php
function get_games()
{

    $meta_q[] = array(
        'key' => 'zakrep',
        'value' => 'Да'
    );
    $limit = 8111111111111111111;
    $exclude = array();
        if(isset($_POST['exclude'])) {
            $exclude = explode(',',$_POST['exclude']);
        }

    // параметры по умолчанию
    $posts_reviews = new WP_Query( array(
        'posts_per_page' => $limit,
        'category'    => 0,
        'orderby'     => 'title',
        'order'       => 'ASC',
        'include'     => array(),
        'post__not_in'     => $exclude,
        'meta_key'    => '',
        'meta_value'  =>'',
        'post_type'   => 'game-list',
        'suppress_filters' => true,
        'meta_query'    => array(
            'relation'      => 'AND',
            $meta_q
        )

    ) );



    $posts_reviews = $posts_reviews->posts;

    if(count($posts_reviews)<$limit) {

        foreach( $posts_reviews as $post ){
            $exclude[] = $post->ID;
        }
    } else {

    }

        $new_limit = $limit - count($posts_reviews);


        $posts_reviews_others = new WP_Query( array(
            'posts_per_page' => $new_limit,
            'category'    => 0,
            'orderby'     => 'title',
            'order'       => 'ASC',
            'include'     => array(),
            'post__not_in'     => $exclude,
            'meta_key'    => '',
            'meta_value'  =>'',
            'post_type'   => 'game-list',
            'suppress_filters' => true, // подавление работы фильтров изменения SQL запроса


        ) );
        $posts_reviews_others = $posts_reviews_others->posts;
        $posts_reviews = array_merge($posts_reviews,$posts_reviews_others);




    global $post;

    $json = array();
    $front_id = get_option('page_on_front'); 
    $price_box = get_field('array_price', $front_id);


    foreach( $posts_reviews as $post ) {
        setup_postdata($post);

        $json['results'][] = array(
            'post_id'=>$post->ID,
            'title'=>get_the_title(),
            'permalink' => get_permalink(),
            'zakrep' => get_field('zakrep'),
            'game_desc' => get_field('game_desc'),
            'versus_game' => get_field('versus_game'),
            'platform_os' => get_field('platform_os'),
            'status_game' => get_field('status_game'),
            'youtube_link' => get_field('youtube_link'),
            'txt_basic' => $price_box['txt_basic'],
            'txt_standart' => $price_box['txt_standart'],
            'txt_premium' => $price_box['txt_premium'],
            'txt_btn_basic' => $price_box['txt_btn_basic'],
            'txt_btn_standart' => $price_box['txt_btn_standart'],
            'txt_btn_premium' => $price_box['txt_btn_premium'],
            'gallery_game_img' => get_field('gallery_game_img'),
            'game_img_main' => get_field('game_img_main')
        );

    }

    echo json_encode($json,true);
    die();

}


Вывожу через JS:
$.ajax({
		url: '/wp-admin/admin-ajax.php',
		method: 'post',
		dataType: 'json',
		data: {
			action: 'get_games',
			exclude: ids
		},
		success: function (data) {


			if (data['results']) {


				html = '';
				for (i = 0; i < data['results'].length; i++) {

					html +='   <div data-slides="[&quot;&quot;]" id="post_id_'+data['results'][i]['post_id']+'" data-post_id="'+data['results'][i]['post_id']+'" class="games__card game" data-name="'+data['results'][i]['title']+'" data-link="'+data['results'][i]['permalink']+'" data-description="'+data['results'][i]['game_desc']+'" ' +
						'data-version="'+data['results'][i]['versus_game']+'" ' +

						'data-device="'+data['results'][i]['platform_os']+'" ' +
						'data-assembly="'+data['results'][i]['status_game']+'"' +
						'data-slides="'+data['results'][i]['gallery_game_img']+'" ' +
						'data-video="'+data['results'][i]['youtube_link']+'" ' +
						'data-basic_txt="'+data['results'][i]['txt_basic']+'" ' +
						'data-standart_txt="'+data['results'][i]['txt_standart']+'" ' +
						'data-premium_txt="'+data['results'][i]['txt_premium']+'" ' +
						'data-btn_basic="'+data['results'][i]['txt_btn_basic']+'" ' +
						'data-btn_standart="'+data['results'][i]['txt_btn_standart']+'" ' +
						'data-btn_premium="'+data['results'][i]['txt_btn_premium']+'" ' +
						'data-img="'+data['results'][i]['game_img_main']+'">\n' +
						'                      <img class="game__img" src="'+data['results'][i]['game_img_main']+'">\n' +
						'                      <h4 class="game__title">'+data['results'][i]['title']+'</h4>\n' +
						'                      <p class="game__subtitle">3 чита от 99 ₽</p>\n' +
						'                    </div>';

				}

				$('.games__cards').append(html)
					//$('#games_card_ends').removeClass('load_progress')
				$('#get_more_games').remove()
				open_game_popup()
			}
		}
	})



}
  • Вопрос задан
  • 47 просмотров
Пригласить эксперта
Ответы на вопрос 1
Ivseti
@Ivseti Автор вопроса
Фронтенд HTML, CSS и немного JS с PHP
Решение оказалось совсем другим

в function.php добавил
$images = array();
foreach ( get_field('gallery_game_img') as $image) {
$images[] = $image['url'];
        }


Вывел в массиве стандартным образом:
'game_img_main' => get_field('game_img_main')

в JS:
html = '';
				for (i = 0; i < data['results'].length; i++) {
					html_img = '';
						if(data['results'][i]['gallery_game_img']) {


					//html_img = JSON.parse(data['results'][i]['gallery_game_img']);

							html_img = '[&quot;'+data['results'][i]['gallery_game_img'].join('&quot;,&quot;')+'&quot;]';
							console.log(html_img)
						}


Вывод:
data-slides="'+html_img+'"
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы