Вопрос

Я хочу создать петлю, где 2 или 3 элемента из моего блогролла сплачиваются как это:

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

Я буду использовать изображения и выдержки для петли, и цель состоит в том, чтобы получить wp_links ссылки на отображение точно так же, как wp_posts, так что если я смогу на самом деле объединять ссылки на $post переменная каким -то образом и зацикливаться на них, как будто они были посты, это было бы здорово.

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

Это было полезно?

Решение 3

Спасибо всем. Вот решение, с которым я в конечном итоге закончил. Вместо того, чтобы возиться в саму петлю, я решил зацепить 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

Другие советы

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

Объединение этих двух массивов нелегко, потому что объект Post обладает совершенно разными свойствами для объекта Link. Если вы хотите сделать это, вам придется запустить карту массива по ответу, возвращаемому get_bookmarks чтобы каждый из этих объектов соответствовал структуре объекта $ 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). Таким образом, вам, вероятно, нужно посмотреть на данные, которые у вас есть, и придумать другую функцию, чтобы сортировать ваши ссылки и посты.

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

Вы можете использовать обычную петлю 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; ?>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top