WordPress相关文章调用:几种代码实现方法详解


文章目录 隐藏

功能需求说明

在制作WordPress主题时,经常需要为文章模板添加相关文章功能。这些相关文章可以出现在侧栏或文章底部,目的是增加访客在网站上的停留时间,提高PV和用户体验。虽然有许多插件可以实现这个功能,但为了节省资源,我们可以通过代码来完成这一功能。下面我们列举了几种实现WordPress相关文章的方法,并对每种方法的执行效率进行了对比。

相关文章实现方法

方法一:标签相关

通过获取文章的所有标签,然后获取这些标签下的相关文章。

<ul>
<?php
global $post;
$post_tags = wp_get_post_tags($post->ID);
if ($post_tags) {
    $tag_list = [];
    foreach ($post_tags as $tag) {
        $tag_list[] = $tag->term_id;
    }
    $post_tag = $tag_list[mt_rand(0, count($tag_list) - 1)];
    $args = array(
        'tag__in' => array($post_tag),
        'category__not_in' => array(), // 不包括的分类ID
        'post__not_in' => array($post->ID),
        'showposts' => 6, // 显示相关文章数量
        'ignore_sticky_posts' => 1
    );
    $query = new WP_Query($args);
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post(); ?>
            <li>* <a href="<?php the_permalink(); ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>
        <?php }
    } else {
        echo '<li>* 暂无相关文章</li>';
    }
    wp_reset_postdata();
} else {
    echo '<li>* 暂无相关文章</li>';
}
?>
</ul>

方法二:分类相关

通过获取文章的分类ID,然后获取该分类下的相关文章。

<ul>
<?php
global $post;
$cats = wp_get_post_categories($post->ID);
if ($cats) {
    $args = array(
        'category__in' => array($cats[0]),
        'post__not_in' => array($post->ID),
        'showposts' => 6,
        'ignore_sticky_posts' => 1
    );
    $query = new WP_Query($args);
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post(); ?>
            <li>* <a href="<?php the_permalink(); ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>
        <?php }
    } else {
        echo '<li>* 暂无相关文章</li>';
    }
    wp_reset_postdata();
} else {
    echo '<li>* 暂无相关文章</li>';
}
?>
</ul>

方法三:标签相关,SQL获取

使用SQL语句直接从数据库中获取标签相关的相关文章。

<ul>
<?php
global $post, $wpdb;
$post_tags = wp_get_post_tags($post->ID);
if ($post_tags) {
    $tag_list = '';
    foreach ($post_tags as $tag) {
        $tag_list .= $tag->term_id . ',';
    }
    $tag_list = rtrim($tag_list, ',');
    $related_posts = $wpdb->get_results("
        SELECT DISTINCT ID, post_title
        FROM {$wpdb->prefix}posts, {$wpdb->prefix}term_relationships, {$wpdb->prefix}term_taxonomy
        WHERE {$wpdb->prefix}term_taxonomy.term_taxonomy_id = {$wpdb->prefix}term_relationships.term_taxonomy_id
        AND ID = object_id
        AND taxonomy = 'post_tag'
        AND post_status = 'publish'
        AND post_type = 'post'
        AND term_id IN ($tag_list)
        AND ID != $post->ID
        ORDER BY RAND()
        LIMIT 6
    ");
    if ($related_posts) {
        foreach ($related_posts as $related_post) { ?>
            <li><a href="<?php echo get_permalink($related_post->ID); ?>" rel="bookmark" title="<?php echo $related_post->post_title; ?>"><?php echo $related_post->post_title; ?></a></li>
        <?php }
    } else {
        echo '<li>暂无相关文章</li>';
    }
} else {
    echo '<li>暂无相关文章</li>';
}
?>
</ul>

方法四:分类相关,SQL获取

使用SQL语句直接从数据库中获取分类相关的相关文章。

<ul>
<?php
global $post, $wpdb;
$cats = wp_get_post_categories($post->ID);
if ($cats) {
    $related_posts = $wpdb->get_results("
        SELECT ID, post_title
        FROM {$wpdb->prefix}posts, {$wpdb->prefix}term_relationships, {$wpdb->prefix}term_taxonomy
        WHERE {$wpdb->prefix}posts.ID = {$wpdb->prefix}term_relationships.object_id
        AND {$wpdb->prefix}term_taxonomy.taxonomy = 'category'
        AND {$wpdb->prefix}term_taxonomy.term_taxonomy_id = {$wpdb->prefix}term_relationships.term_taxonomy_id
        AND {$wpdb->prefix}posts.post_status = 'publish'
        AND {$wpdb->prefix}posts.post_type = 'post'
        AND {$wpdb->prefix}term_taxonomy.term_id = " . $cats[0] . "
        AND {$wpdb->prefix}posts.ID != " . $post->ID . "
        ORDER BY RAND()
        LIMIT 6
    ");
    if ($related_posts) {
        foreach ($related_posts as $related_post) { ?>
            <li>* <a href="<?php echo get_permalink($related_post->ID); ?>" rel="bookmark" title="<?php echo $related_post->post_title; ?>"><?php echo $related_post->post_title; ?></a></li>
        <?php }
    } else {
        echo '<li>* 暂无相关文章</li>';
    }
} else {
    echo '<li>* 暂无相关文章</li>';
}
?>
</ul>

方法五:作者相关

通过获取同一作者的其他文章来显示相关文章。

<ul>
<?php
global $post;
$post_author = get_the_author_meta('ID');
$args = array(
    'author' => $post_author,
    'post__not_in' => array($post->ID),
    'showposts' => 6,
    'orderby' => 'date',
    'ignore_sticky_posts' => 1
);
$query = new WP_Query($args);
if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post(); ?>
        <li>* <a href="<?php the_permalink(); ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>
    <?php }
} else {
    echo '<li>* 暂无相关文章</li>';
}
wp_reset_postdata();
?>
</ul>

时间效率对比

我们通过测量每种方法的执行时间来评估其效率。在同一篇文章中获取6篇相关文章的测算时间如下:

  • 方法一:0.18067908287048 秒

  • 方法二:0.057158946990967 秒

  • 方法三:0.037126064300537 秒

  • 方法四:0.045628070831299 秒

  • 方法五:0.023991823196411 秒

这些时间只是参考值,实际效率可能会因服务器性能和数据库大小等因素有所不同。通过上述几种方法,可以根据具体需求和偏好选择最合适的相关文章实现方式。

希望这些方法和代码能帮助你在WordPress网站中实现相关文章功能。如有任何疑问或进一步需求,请随时告知。


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至123@#-@12-3.com举报,一经查实,本站将立刻删除。

共有 30 条评论