2016-03-15 12 views
2

Мне сложно отказаться от использования поля файла CMB2 в моей галерее, но у него нет возможности (встраиваться) в paginate (например, ACF), и мои навыки PHP не хватает. Я могу сделать это с помощью jQuery, но Я хочу реальные страницы.CMB2 file_list paginate (real pages) foreach использует сериализованные данные

Это приближается к тому, что мне нужно, и это связано с другим вопросом. Он разбивает 5 результатов из $ files (get_post_meta) и создает страницы, но изображения представляют собой одинаковые изображения на всех страницах. Я вне пределов своего мозга.

$ attachment_id => $ attachment_url - это индивидуальное изображение, выбранное из медиатеки.

$files as $attachment_id => $attachment_url 

Вот что я до сих пор (вы можете угробить его в пользу чего-то лучшего):

function gallery_loop() { 

if(get_query_var('page')) { 
    $page = get_query_var('page'); 
} else { 
    $page = 1; 
} 


$img_size = 'portfolio-catalog'; 


$files = get_post_meta(get_the_ID(), '_cmb_gallery_images', true); 
$limit = 5; 
$total = count($files); 
$pages = ceil($total/$limit); 

$curr_page = isset($_GET['page']); 
$offset = ($curr_page - 1) * $limit; 


$items_array = array_chunk((array) $files, $limit, true); 

$files_array = array_slice($items_array, $offset, true); // this is showing the same 5 items on all the pages 

foreach ($files_array as $files) { 

    echo '<div style="border:1px solid red;">'; //BEGIN FAKE "page" so I can see if they are splitting correctly 

    foreach ($files as $attachment_id => $attachment_url) { 

    $page=1; 

     echo '<div class="file-list-image">'; 
     echo wp_get_attachment_image($attachment_id, $img_size); 
     echo '</div>'; 

    $page++; 


    } // end $files as $attachment_id => $attachment_url 

    echo '</div>'; //END "page" so I can see if they are splitting correctly 


} // end foreach $files_array as $files 



//the correct amount of pages are showing up but the items are all the same 
echo paginate_links(array(
    'base' => get_permalink() . '%#%' . '/', 
    'format' => '?page=%#%', 
    'current' => $page, 
    'total' => $pages 
)); 


} 
// end function 

ответа на вопросы в комментариях:

Это для шаблон страницы под названием gallery-page.php. Это страница с типом поля CMB2, называемым file_list, и это место для прикрепления изображений (они прикреплены не к странице, а к этому полю, чтобы вы могли захватить все и загрузить к ней).

Когда я делаю print_r из $files = get_post_meta(get_the_ID() , '_cmb_gallery_images', true); я получаю:

Array([956] => http://mydevserver.dev/wp-content/uploads/2016/02/bamboo-logo.jpg [960] => http://mydevserver.dev/wp-content/uploads/2016/02/tampa_guitar_logo.jpg [958] => http://mydevserver.dev/wp-content/uploads/2016/02/CNG-refueling.jpg [974] => 

и так далее.

+0

Является ли это для одной страницы –

+0

, как вы приняли массив изображения из get_post_meta (get_the_ID(), '' _cmb_gallery_images, правда); Таким образом, либо все изображения должны быть использованы на одной странице, либо для этого был создан тип публикации галереи. Просьба уточнить ? –

+0

Итак, вы зацикливаете функцию как?Предполагая, что вы хотите это для одной страницы, вы вызываете 'get_post_meta (get_the_ID(), '_cmb_gallery_images', true)', который просто получает мета-сообщение этой страницы. Когда вы делаете 'print_r ($ files);' прямо под определением переменной, что вы получаете? –

ответ

1

Используйте ниже приведенный ниже код, на странице будет отображаться 5 изображений, а ссылки на страницы - позволяют пользователю перемещаться между страницами галереи с помощью довольно URL-адресов, таких как/gallery/2 /,/gallery/3/и т. д.

function gallery_loop() { 

    if (get_query_var('page')) { 
     $page = get_query_var('page'); 
    } 
    else { 
     $page = 1; 
    } 

    //* variables 
    $row = 0; 
    $images_per_page = 5; //image count 
    $img_size = 'portfolio-catalog'; //image size 
    $images = get_post_meta(get_the_ID() , '_cmb_gallery_images', true); //cmb2 field 
    $total = count($images); 
    $pages = ceil($total/$images_per_page); 
    $min = (($page * $images_per_page) - $images_per_page) + 1; 
    $max = ($min + $images_per_page) - 1; 


    echo '<ul class="your-class clearfix">'; 

    //* create the 'pages'  
    if (count($images) > 0) { 

     foreach ((array) $images as $attachment_id => $attachment_url) { 


      $row++; 

      // ignore this image if $row is lower than $min 
      if ($row < $min) { 
       continue; 
      } 

      // stop loop completely if $row is higher than $max 
      if ($row > $max) { 
       break; 
      } 

      //echo the images 
      echo '<li>'; 
      echo wp_get_attachment_image($attachment_id, $img_size); 
      echo '</li>'; 


     } //end foreach 

     //* pagination 
     echo paginate_links(array(
      'base' => get_permalink() . '%#%' . '/', 
      'format' => '?page=%#%', 
      'current' => $page, 
      'total' => $pages 
     )); 

    } else { 

     echo '<li>No images found.</li>'; 

    } //endif; 

    echo '</ul>'; 


} // end gallery_loop; 
+0

Спасибо. Это выглядит многообещающе. Я получаю эту ошибку 'Undefined variable: metas in/...' – Christina

+0

Я didn ' t нужно 'get_meta_values', я получил его работу и опубликую суть в этом потоке. Если вы обновите свой ответ w с содержанием gist, тогда я отмечу это принятое. Я бы не смог понять это без тебя, так что СПАСИБО! Меня это раздражало, хотя у меня не было никакого текущего проекта, который этого требовал, и это очень удобно. – Christina

+0

Хорошо, я не готов к использованию, так как хочу выработать некоторые другие вещи, которые не связаны с вопросом. Вот jsbin, я застрял php в поле js: https://jsbin.com/gabozu/js – Christina

0

Я предполагаю, что все данные на самом деле находятся в ваших соответствующих варах. Но так или иначе, не могли бы вы предоставить var_dump из $ файлов после того, как вы установите его из post_meta? (В случае, если мое быстрое решение не будет работать)

Кроме того, вместо array_slice вы можете использовать прямой индекс элемента массива в Еогеаспе заявлении, но это не важно

foreach ($items_array[$curr_page - 1] as $files) { 

Во всяком случае, главная проблема здесь :

$curr_page = isset($_GET['page']); 

isset всегда возвращает true или false (1 или 0). Итак, несмотря на страницу, вы всегда загружаете первый или второй. Просто замените код с:

$curr_page = isset($_GET['page']) ? $_GET['page'] : 0; 

Кроме того, вы можете проверить $ _GET [ 'страницы'] с is_int() или is_numeric() & вокруг него (на всякий случай: D)

Смежные вопросы