Как связать ссылки wp_links в цикле?

Я хочу создать цикл, в котором 2 или 3 элемента из моего blogroll объединены следующим образом:

<loop> <post1> <post2> <blogroll1> <post3> <blogroll3> </loop> 

Я буду использовать образы и выдержки для цикла, и цель состоит в том, wp_links ссылки wp_links отображались ТОЧНО, как wp_posts , поэтому, если я могу фактически wp_links ссылки на переменную $post как-то и перебрать их, ЕСЛИ они были посты, это было бы здорово.

Получение сообщений через get_bookmarks очень просто, но как бы я get_bookmarks WP, чтобы подумать, что это $posts и как бы связать их с объектом $post ?

Solutions Collecting From Web of "Как связать ссылки wp_links в цикле?"

Я пробовал что-то похожее на это (ну, немного другое, я попытался создать временную шкалу, где сообщения и комментарии появлялись на той же временной шкале) …

Слияние этих двух массивов непросто, потому что объект post имеет совершенно разные свойства для объекта ссылки. Если вы хотите это сделать, вам нужно будет запустить карту массива по ответу, возвращаемому get_bookmarks чтобы каждый из этих объектов соответствовал структуре объекта post post; затем объедините два массива, а затем, наконец, утилизируйте их, используя собственную функцию сравнения. Много головной боли для очень небольшого выигрыша.

Если вы только начинаете с этого, почему бы не сделать ваши ссылки настраиваемыми типами сообщений, чтобы вы могли объединить свои ссылки и сообщения в одном запросе?

Или еще лучше, если вы можете работать с версиями разработки 3.1, сделайте свои ссылки в формате сообщений ! Таким образом, нет никакого конфликта с запросом на всех, и он будет работать для вас с места в карьер.

Изменить: я изначально ввел этот код в отдельный ответ. Я следую рекомендации Яна, чтобы объединить свои ответы в одном, чтобы он стал более ясным.

Хорошо, так что это действительно неудобно, и я повторяю, что я не рекомендую вам это делать, но если вам нужно, это должно сделать это за вас:

 $links = get_bookmarks('show_updated=true'); /* Map the properties of the link to the structure of a post object */ $linkposts = array_map( 'link2postobj', $links ); function link2postobj( $obj ) { $post_object = array( 'post_name' => $obj->link_name, 'post_content' => '<a href="'.$obj->link_href.'" >'. $obj->link_name.'</a><p>'. $obj->link_description.'</p>', // the "content" 'post_author' => $obj->link_owner, 'post_date' => $obj->link_updated, 'post_status' => 'link', // just a tag to mark this as a link 'guid' => $obj->link_href ); return (object)$post_object; } /* Merge links returned with posts in query */ global $wp_query; $posts = array_merge( $wp_query->posts, $linkposts ); /* Sort together by your function (this uses link_updated date to merge in the timeline. Note that link_updated is not a reliable property to depend on. */ usort( $posts, 'sortbydate' ); function sortbydate( $a, $b ) { return ( strtotime($a->post_date) > strtotime($b->post_date) ); } /* now just loop through your timeline */ foreach ( $posts as $post ) : if ( 'link' == $post->post_status ) { // template for links here } else { setup_postdata( $post ); // template for regular posts here } endforeach; 

В дополнение к другим проблемам, которые я предвидел, я заметил, что поле link_updated не очень надежное (много ссылок из моего db возвращено 0 в качестве значения link_updated). Поэтому вам, вероятно, нужно взглянуть на данные, которые у вас есть, и придумать другую функцию для сортировки ваших ссылок и сообщений.

Серьезно, однако, подумайте о том, чтобы встать на краю кровотока и перенести все ваши ссылки в сообщения с форматом «link» . Я думаю, что для того, что вы пытаетесь сделать, это просто делает больше смысла, и время, необходимое для запуска сценария и создания новых сообщений для каждой из ваших ссылок, будет намного меньше, чем хлопот по поддержанию формата, подобного этому.

Вы можете использовать обычный цикл wp (нет необходимости в осложнениях) и get_bookmarks ($ args), чтобы получить нужные вам ссылки.

Что-то вроде этого:

 $i = 1; <?php if (have_posts()) : while (have_posts()) : the_post(); ?> //your posts here if ($i&1) echo 'blogroll '.$i;//blogroll 2, 4, etc. $i++; <?php endwhile; endif; ?> 

Спасибо всем. Вот решение, которое я в конечном итоге закончил. Вместо того, чтобы возиться в самом цикле, я решил подключиться к the_post с помощью функции, которая воссоздает разметку цикла, используя данные из $links .

  <?php global $links; global $links_count; $links = get_bookmarks("limit=5"); function dg_archive_insert_links(){ global $post; if (!is_singular()){ add_action('the_post', 'dg_insert_links'); } } add_action('wp', 'dg_archive_insert_links'); function dg_insert_links(){ global $wp_query; global $links_count; global $links; if ( ($wp_query->current_post % 3) == 0 && ($wp_query->current_post > 0) && $links[$links_count]->link_url): ?> <div class="post type-post hentry"> <h2><a href="<?php echo $links[$links_count]->link_url; ?>" rel="bookmark" title='Click to read: "<?php echo $links[$links_count]->link_name; ?>"'><?php echo $links[$links_count]->link_name; ?></a></h2> <?php if ($links[$links_count]->link_description): ?><div class="entry-summary"><?php echo $links[$links_count]->link_description; ?></div><?php endif; ?> <?php if ($links[$links_count]->link_image && $links[$links_count]->link_description): ?> <a href="<?php echo $links[$links_count]->link_url; ?>" rel="bookmark" title="<?php echo $links[$links_count]->link_description; ?>" class="post_thumbnail" ><img src="<?php echo $links[$links_count]->link_image; ?>" width="150px" alt="<?php echo $links[$links_count]->link_description; ?>" /> </a> <?php endif; ?> </div> <?php $links_count++; endif; } 

Нет необходимости создавать новый var для подсчета, поскольку он уже существует в $wp_query->current_post