如何将wp_link中的链接拼接到循环中?

时间:2010-11-10 作者:Dan Gayle

我想创建一个循环,其中我的blogroll中的2或3个项目是这样拼接的:

<loop>
    <post1>
    <post2>
    <blogroll1>
    <post3>
    <blogroll3>        
</loop>
我将使用图像和摘录进行循环,目标是wp_links 显示的链接与wp_posts, 所以如果我能把链接拼接到$post 以某种方式进行变量转换,并将其作为帖子进行循环,这将非常好。

通过获取帖子get_bookmarks 这很容易,但我怎么能假装WP认为他们$posts 我该如何将它们拼接到$post 对象

3 个回复
最合适的回答,由SO网友:Dan Gayle 整理而成

谢谢大家。这是我最终得到的解决方案。我没有在循环中胡闹,而是选择了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

SO网友:goldenapples

我也尝试过类似的方法(嗯,略有不同,我所做的是尝试创建一个时间线,在同一时间线中显示帖子和评论)。。。

合并这两个数组并不容易,因为post对象与link对象具有完全不同的属性。如果要这样做,必须对返回的响应运行数组映射get_bookmarks 使这些对象中的每一个都符合$post对象的结构;然后合并这两个数组,最后使用您自己的比较函数对它们进行排序。头痛得厉害,收获甚微。

如果您刚刚开始使用此功能,为什么不将链接设置为自定义帖子类型,以便可以在一个查询中合并链接和帖子?

或者更好的是,如果您可以使用3.1的开发版本,请将您的链接设置为帖子format! 这样就根本不会干扰查询,它只会立即对您起作用。

Edit: I originally entered this code in a separate answer. I\'m following Jan\'s recommendation to combine my answers into one so that its more clear.

好吧,这确实是不可靠的,我重申我不建议你这样做,但如果你必须这样做,这应该为你做:

$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\\u updated字段不是很可靠(我数据库中的许多链接都返回0作为link\\u updated值)。因此,您可能需要查看您拥有的数据,并想出一个不同的函数来对链接和帖子进行排序。

不过,认真地说,可以考虑站在最前沿,将所有链接迁移到posts with the "link" format. 我认为对于你正在尝试做的事情来说,这更有意义,并且运行脚本和为每个链接创建新帖子所需的时间将大大少于维护这样的格式所需的时间。

SO网友:conualfy

您可以使用普通的wp循环(无需复杂化)并获取\\u书签($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; ?>

结束

相关推荐

Stop underlining image links

在我的小部件栏上,我有一个超链接的图像。问题是CSS强调了这一点。如何删除下划线?更新:刚刚注意到这是导致下划线的原因:} .entry a, .secondaryColumn a, #commentsContainer h3 a, .commentlist .comment-author a { border-bottom: 1px solid #ddd; color: #3c6c92; font-weight: bold;