随机展示一篇文章/随便看看-限定作者和发布时间

最近在测试wordpress的时候偶然发现了一个“随便看看”的功能,通过建立一个页面模板的方式实现(传送),实现起来挺简单。后来又发现了另外一种方式,直接在主题functions.php里添加代码(传送),也很方便就可以完成。

可是这个时候就在想,怎么样让显示的文章只属于某几个分类,而且发布的时间不能超过一定的范围。先去找有没有现成的,中文网站和英文网站用各种关键词搜索了一圈,没有……不仅没有代码连插件都没有,在发布/转发该功能代码的博文中也留了言,不过也不一定能收到回复吧。看来得自己动手了,需要在where语句里增加两个条件,一个是分类,一个是发布时间。由于php已经几乎忘光了,SQL的那几句话当初就糊里糊涂的,所以折腾了好几个小时,失败中有了一点点的成功。要感谢很多博文和帖子,在其中找到了有用的信息。

首先想实现限制分类的功能,尝试过很多博文里提供的信息、群里面问其他人(沈大佬表示他/她明天开发个插件),没搞定。后来和“榆木”大佬小窗,首先教我怎么“打印”:print_r($query);exit(); 加到query定义后面。网页执行出来的语句结果输入到SQL执行,然后通过提示信息找问题。后来才想起来以前好像是学过print哦……下次就不会傻傻地输入CTRL+P还想着打印预览能看到什么了……

操作了一会儿数据库,没有找到分类的字段,以前wordpress可能是分类有单独的表,现在好像是term_id再通过一些联系进行的。虽然分类的限制没搞定,但是对作者的限制倒是简单,posts表里直接就有这个字段,加入 AND post_author = ‘2’ 试了试,可以,至少验证了加到where的方式是对的。

后来尝试了很多次限制分类的条件,转而去看限制时间能不能先实现。posts表里就有post_date这个字段,于是尝试写到代码的where里去,然而,文法错误的情况下自然执行不出正确的结果。这时候我想,找一下实现其他功能时限制发布时间的代码(wordpress发布多少天的过滤条件代码),开始也失败,不过找到了一个“wordpress获取一定天数内发表的文章代码”,非常接近,于是就把where里面的部分copy了进来,限制文章发布时间的代码终于也生效。

// 随便看看开始-限定作者和发布时间
function random_postlite() {
global $wpdb;
$query = "SELECT ID FROM $wpdb->posts WHERE post_type = 'post' AND post_password = '' AND post_author in (作者id) AND post_date > '" . date('Y-m-d', strtotime('-天数 days')) . "' AND post_status = 'publish' ORDER BY RAND() LIMIT 1";
if ( isset( $_GET['random_cat_id'] ) ) {
$random_cat_id = (int) $_GET['random_cat_id'];
$query = "SELECT DISTINCT ID FROM $wpdb->posts AS p INNER JOIN $wpdb->term_relationships AS tr ON (p.ID = tr.object_id AND tr.term_taxonomy_id = $random_cat_id) INNER JOIN $wpdb->term_taxonomy AS tt ON(tr.term_taxonomy_id = tt.term_taxonomy_id AND taxonomy = 'category') WHERE post_type = 'post' AND post_password = '' AND post_author in (2,5,6) AND post_date > '" . date('Y-m-d', strtotime('-100 days')) . "' AND post_status = 'publish' ORDER BY RAND() LIMIT 1";
}
if ( isset( $_GET['random_post_type'] ) ) {
$post_type = preg_replace( '|[^a-z]|i', '', $_GET['random_post_type'] );
$query = "SELECT ID FROM $wpdb->posts WHERE post_type = '$post_type' AND post_password = '' AND post_author in (2,5,6) AND post_date > '" . date('Y-m-d', strtotime('-100 days')) . "' AND post_status = 'publish' ORDER BY RAND() LIMIT 1";
}
$random_id = $wpdb->get_var( $query );
wp_redirect( get_permalink( $random_id ) );
exit;
}
if ( isset( $_GET['random'] ) )
add_action( 'template_redirect', 'random_postlite' );
// 随便看看结束

以上为修改之后的代码(主题functions.php),点击导航栏“Cat. 勿听”即可随机展示一篇文章。

限制分类的条件有朋友比较熟悉的话欢迎留言告知。

附一些参考过程中比较有用的博文:

如何让WordPress一个页面显示全部(几个)分类的文章
WordPress数据库中的表、字段、类型及说明 (现在的wp已经有不同)
WordPress 中分类、标签在数据库中是如何和文章关联的?
给 wordpress Category (分类)添加字段
WordPress为分类添加自定义字段
wordpress 给分类目录加自定义字段
WordPress 限定用户更新或删除文章的时间期限

作者: 椰林物语

博士,摩托车手。发布内容为:生活、站点、其他。

《随机展示一篇文章/随便看看-限定作者和发布时间》有8个想法

  1. 加个in_category即可。
    例子: https://zmingcx.com/wordpress-only-allows-viewing-of-specific-posts.html
    比如你这个,在第一个query处,简单的在isset后面,比如限定为旅游,则加上 && if ( in_category( ‘travel’ ))
    为防止取不到对应cat的id,后面再加上一段else 再来一次rand取到合适的随机id

    另外还有种笨思路,在第二个query里sql加上判断 where category = xxx 也行。

    ps 页面不让拷贝代码真是要差评!!!

    1. 满怀激动的试了试,不行……
      AND in_category( array( 1,2 ) ) / AND in_category( 1,2 ) / AND in_category = ‘1’ / AND category = ‘1’ 都试了
      我现在正在把内容重新迁移到新搭建的wp里。最近发现响应时间总是很长,用现在的代码和新wp的数据库/现在的代码和新wp数据库加上把文章内容导入后/现在的数据库和新wp代码……还有包括把数据库用插件清理,大概尝试了五六种组合,发现插件即便多,新数据库导入站点内容后响应时间也挺快……所以想着重新搭建一个wp,把现在应用的插件安装上,然后把内容迁移进去看看怎么样。昨天随便试一试的时候导入的内容稍微有些问题,个别文章的评论消失了……

      1. 不好意思昨天脑子不好,忽略了一段重要的代码。
        $query那段sql取到了ID后,应该:
        $cat = get_the_category( 取到的文章ID )
        再把cat数组loop到 in_category 去遍历……

        1. $cat = get_the_category( 取到的文章ID )的这个方式我其实最开始试过……也许是哪里没写对……回头再试一下。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注