wp_list_pages => array()

суть в следующем – получить список страниц не как вывод данных, а как ассоциированный массив, что-бы в дальнейшем можно было им манипулировать как душе угодно. preg_replace уже не хватает. К примеру, следующими нехитрыми манипуляциями выдергиваю список постов из категории и делаю из них аккуратный массив (как следствие, вывожу на слайдере индекса):

  # подключаем массивы, храняшие настройки, и прописанные в functions.php
  global $portfolioImages, $previewObjectsIDs, $indexPreviewData;
  # локальные переменные тоже оглашаем
  static $i = 0;
  $indexPreviewData = array(); # этот массив будет хранить данные для формирования превью на индексе

  # получаем посты из категории портфолио
  $portfolioPosts = new WP_Query('cat='.$infinePostsCats['portfolio'][categoryId].'&showposts=5&orderby=ID');
  while($portfolioPosts->have_posts()) {
    $portfolioPosts->the_post();
    $indexPreviewData[$i] = array( # пишем и парсим необходимые данные в массив
      id => $post->ID,
      title => $post->post_title,
      guid => $post->guid,
      permalink => get_permalink(),
      liClass => $previewObjectsIDs[$i],
      imageId => preg_replace("/(.*)".$portfolioImages[previewRegular]."(.*)/is", '$2', $post->post_content)
    );
    $i++;
  }

с постами понятно, но со страницами чего-то запарился. ваши мысли, коллеги?

А чем не нравится штатная функция get_posts()?

интересный вопрос 🙂 момент был в том, что тот-же seo-all-in-one опнимал луп как единственно верный, и те-же заголовки как следствие переписывал через одно место. "не айс" в общем. да и квери по моему быстрее работает.
вопрос со страницами остается

сам и отвечаю тогда:

$pages = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->posts WHERE post_type = 'page'"));

встречный вопрос, на который ещё не ответил – получить пермалинку к посту

Сам же написал выше – get_permalink.

вуа-ля. получаем готовую функцию:

<?php 
function wp_list_pagesA() {
  global $wpdb;
  static $pages, $i = 0;
  $pagesList = array();
  $pages = $wpdb->get_results($wpdb->prepare("SELECT * FROM $wpdb->posts WHERE post_type = 'page'"));
  foreach($pages as $page){
    $pagesList[$i] = array(
      id => $page->ID,
      status => $page->post_status,
      date => $page->post_date,
      modified => $page->post_modified,
      post_name => $page->comment_status,
      title => $page->post_title,    
      content => $page->post_content,
      except => preg_replace("/<!--(.*)more(.*)-->(.*)/is", '', $page->post_content),
      comment_status => $page->comment_status,
      comment_count => $page->comment_count,    
      guid => $page->guid,
      permalink => get_permalink($page->ID)    
    );
    $i++;
  }
  return $pagesList;
}
print_r(wp_list_pagesA());
?>

get_permalink – из головы вылетело.. )

Кстати, get_permalink() – очень подлая функция, мне показалось, что она для каждого запрошенного поста порождает два запроса к базе. Будет время – проверь.

проверил, один. конечно, уже не дело делать по два запроса (получить данный, получить пермалинк) для одного поста, будут мысли по этому поводу – давай обсудим как сделать оптимальнее

Проверял на странице или на посте?

данную функцию использую на индексе чтоб вывести список страниц. не комментируя get_permalink() получаем <!– 23 queries. 0.471 seconds. –>, комментируя <!– 18 queries. 0.498 seconds. –> (всего – 5 страниц)

Со страницами проще, им не нужно получать категории для пермалинка, а постам – нужно.

Кстати, а нафига вообще для страниц функция, если пермалинк для них всегда (ну, почти) "сайт/слаг" ?

универсальность подхода (гы)

Anonymous
Отправить
Ответ на: