侧面栏显示wordpress专题列表

月小升的专题用的EG-Series,翻了很多文档,说无法侧边栏展示

第一部分:利用wp_term_taxonomy 来读取专题的帖子


1. 追踪wp_term_taxonomy表
wp_term_taxonomy 这个表存了不少东西

SELECT distinct(`taxonomy`) FROM `wp_term_taxonomy` WHERE 1
category
link_category
nav_menu
post_format
post_tag
series

包含了series这个就是我的EG_Series插件利用的数据类别了。说明wordpress的分类系统是可以被自由的扩展的

SELECT * FROM wp_term_taxonomy where taxonomy = 'series'


返回的数据都是我的EG_Series的自定义分类

2 . 利用wp_term_relationships 得到post的id
SELECT * FROM `wp_term_relationships` WHERE `term_taxonomy_id` = 501

3. 在sitebar.php里加代码

<?php
//读取一个文章所在的组。
function custom_taxonomies_terms_ids(){
    //根据当前文章ID获取文章信息
    $post = get_post( $post->ID );
 
    //获取当前文章的文章类型
    $post_type = $post->post_type;
 
    //获取文章所在的自定义分类法
    $taxonomies = get_object_taxonomies( $post_type, 'objects' );
 
    $outid = array();
    $outname = array();
 
 
    foreach ( $taxonomies as $taxonomy_slug => $taxonomy ){
        $term_list = wp_get_post_terms($post->ID, $taxonomy_slug, array("fields" => "all"));
        //echo '['.$term_list[0]->name.']'; //显示文章所处的分类中的第一个
 
        //var_dump($term_list);
        if($term_list[0]->taxonomy=='series'){
        	$outid[] = $term_list[0]->term_taxonomy_id;
        	$outname[] = $term_list[0]->name;
        }
    }
    $outnamestr = implode(',', $outname);
    $outidstr = implode(',', $outid);
 	//return $out;
    return array($outidstr,$outnamestr);
}
$idall = custom_taxonomies_terms_ids();
$ids =$idall[0];
$names =$idall[1];
 
 
$list = $wpdb->get_results("SELECT post_name,post_title FROM $wpdb->term_relationships a left join $wpdb->posts b on a.object_id=b.ID WHERE `term_taxonomy_id` in ($ids) order by a.term_order"); 
 
$str = '';
foreach ($list as $key => $v) {
	$str .= '<li><a href="/blog/'.$v->post_name.'">'.$v->post_title.'</a></li>';
}
	?>

4. 结果得出侧面条

排序不对,利用term_order无效,发现表里的term_order全部为0

第二部分:利用wp_options表


发现排序用的

SELECT * FROM `wp_options` WHERE `option_name` LIKE '_transient_EG-Series-posts-500'
a:15:{i:1375;O:8:"stdClass":6:{s:2:"ID";i:1375;s:10:"post_title";s:42:"服务器监控特定端口一天得流量";s:7:"excerpt";s:358:"本文写了两个监控 iptraf 可以方便得监控瞬时流量, 关于瞬时流量网络上很多命令,月小升java-er.com也用过iftop iptable 监控一定时间以后,某一个端口的流量 干嘛用的? 我要买CDN,为网络https加速,里面有两个选项,一个叫按日流量付费(每天24小时的流量),一个叫按流";s:9:"permalink";s:49:"http://localhost/blog/ali-server-iptraf-iptables/";s:9:"post_date";s:19:"2018-11-02 10:56:39";s:10:"menu_order";i:0;}i:818;O:8:"stdClass":6:{s:2:"ID";i:818;s:10:"post_title";s:35:"java多线程 生产消费者模型";s:7:"excerpt";s:338:"[seriesposts sid=500] 下面的代码讲述了一个故事 一个面包生产铺里目前有30个面包,有三个人来买面包,第一个人要买50个,第二个要买20个,第三个要买30个。 第一个人不够,所以等着,让第二个买了。面包铺继续生产面包。有7个人在生产。 package com.javaer.thr";s:9:"permalink";s:43:"http://localhost/blog/java-thread-consumer/";s:9:"post_date";s:19:"2014-07-30 04:31:46";s:10:"menu_order";i:7;}i:812;O:8:"stdClass":6:{s:2:"ID";i:812;s:10:"post_title";s:23:"java多线程 优先级";s:7:"excerpt";s:388:"[seriesposts sid=500] 要点:优先级仅仅增大概率,但是并非一定会优先 在多线程中,与线程休眠类似,线程的优先级仍然无法保障线程的执行次序。只不过,优先级高的线程获取CPU资源的概率较大,优先级低的并非没机会执行。 线程的优先级用1-10之间的整数表示,数值越大优先级越高,默认的优";s:9:"permalink";s:43:"http://localhost/blog/java-thread-priority/";s:9:"post_date";s:19:"2014-07-10 04:54:58";s:10:"menu_order";i:11;}i:811;O:8:"stdClass":6:{s:2:"ID";i:811;s:10:"post_title";s:28:"Java多线程,线程守护";s:7:"excerpt";s:360:"[seriesposts sid=500] 核心说明:理解这句话下面可以不看了。 守护与其他线程同时执行,当正在运行的线程都是守护线程时,Java 虚拟机退出。 守护线程与普通线程写法上基本么啥区别,调用线程对象的方法setDaemon(true),则可以将其设置为守护线程。 守护线程使用的情况较少";s:9:"permalink";s:38:"http://localhost/blog/java-set-daemon/";s:9:"post_date";s:19:"2014-07-07 10:36:50";s:10:"menu_order";i:12;}i:810;O:8:"stdClass":6:{s:2:"ID";i:810;s:10:"post_title";s:44:"Java多线程中的wait与notify,notifyall";s:7:"excerpt";s:324:"[seriesposts sid=500] 在Java多线程编程中,wait()的作用的是让当前线程进入阻塞状态,notify()是让当前线程唤醒继续执行。虽然是对线程状态的控制,但它们其实都是Object中的方法,这是因为wait与notify所起的作用与线程间的互斥锁有关。 在执行wait()和";s:9:"permalink";s:49:"http://localhost/blog/java-wait-notify-notifyall/";s:9:"post_date";s:19:"2014-07-05 11:55:12";s:10:"menu_order";i:13;}i:804;O:8:"stdClass":6:{s:2:"ID";i:804;s:10:"post_title";s:31:"java 多线程join,合并线程";s:7:"excerpt";s:282:"[seriesposts sid=500] 线程的join合并的含义就是将几个并行线程的线程合并为一个单线程执行,应用场景是当一个线程必须等待另一个线程执行完毕才能执行时可以使用join方法。 package com.javaer.thread; public class Tjoin { /** *";s:9:"permalink";s:39:"http://localhost/blog/java-thread-join/";s:9:"post_date";s:19:"2014-07-04 10:54:06";s:10:"menu_order";i:10;}i:800;O:8:"stdClass":6:{s:2:"ID";i:800;s:10:"post_title";s:27:"java多线程,让步yield";s:7:"excerpt";s:166:"[seriesposts sid=500] 先看个yield让步的例子 package com.javaer.thread; public class YThread implements Runnable { private Object obj = new Object(); /** * @pa";s:9:"permalink";s:40:"http://localhost/blog/java-yield-thread/";s:9:"post_date";s:19:"2014-07-02 10:22:36";s:10:"menu_order";i:9;}i:799;O:8:"stdClass":6:{s:2:"ID";i:799;s:10:"post_title";s:19:"java多线程休眠";s:7:"excerpt";s:258:"[seriesposts] 线程休眠的方法是Thread.sleep(long millis) 和Thread.sleep(long millis, int nanos) sleep()单位是毫秒 问题1.休眠的时候,哪个线程会休眠 答案:哪个线程调用了sleep,哪个就会休眠 问题2.主线程能休眠";s:9:"permalink";s:39:"http://localhost/blog/java-thread-xium/";s:9:"post_date";s:19:"2014-07-01 13:33:05";s:10:"menu_order";i:1;}i:797;O:8:"stdClass":6:{s:2:"ID";i:797;s:10:"post_title";s:28:"java多线程,同步与锁";s:7:"excerpt";s:249:"[seriesposts sid=500] 线程的同步和锁的问题,我们先来看个例子, 下面的例子我们希望两个线程对m变量进行削减 package com.javaer.thread; /** * 测试线程同步锁的问题 * @author yuexiaosheng * */ public class";s:9:"permalink";s:39:"http://localhost/blog/java-thread-lock/";s:9:"post_date";s:19:"2014-06-30 04:48:50";s:10:"menu_order";i:2;}i:795;O:8:"stdClass":6:{s:2:"ID";i:795;s:10:"post_title";s:37:"java采用Runnable 实现多线线程";s:7:"excerpt";s:212:"[seriesposts sid=500] 使用实现Runnalbe可以做出一个多线程,之前我们采用继承Thread的办法也做出一个。 public class TestMitiThread1 implements Runnable { public static void main(String[";s:9:"permalink";s:36:"http://localhost/blog/java-runnalbe/";s:9:"post_date";s:19:"2014-06-29 02:28:48";s:10:"menu_order";i:4;}i:787;O:8:"stdClass":6:{s:2:"ID";i:787;s:10:"post_title";s:31:"java多线程要注意的地方";s:7:"excerpt";s:398:"[seriesposts] 多线程都会遇到主线程控制的事情,一个宿主分发了多个任务出去,如何知道各自的完成情况。就需要子线程给宿主报告。 1、明确目的,为什么要使用多线程?如果是由于单线程读写或者网络访问(例如HTTP访问互联网)的瓶颈,可以考虑使用线程池。如果是对不同的资源(例如SOCKET连接)";s:9:"permalink";s:41:"http://localhost/blog/java-thread-notice/";s:9:"post_date";s:19:"2014-06-28 10:00:22";s:10:"menu_order";i:6;}i:786;O:8:"stdClass":6:{s:2:"ID";i:786;s:10:"post_title";s:51:"认识多任务、多进程、单线程、多线程";s:7:"excerpt";s:360:"[seriesposts title="2"] 要认识多线程就要从操作系统的原理说起。 以前古老的DOS操作系统(V 6.22)是单任务的,还没有线程的概念,系统在每次只能做一件事情。比如你在copy东西的时候不能rename文件名。为了提高系统的利用效率,采用批处理来批量执行任务。 现在的操作系统";s:9:"permalink";s:31:"http://localhost/blog/duorenwu/";s:9:"post_date";s:19:"2014-06-28 09:55:00";s:10:"menu_order";i:14;}i:785;O:8:"stdClass":6:{s:2:"ID";i:785;s:10:"post_title";s:25:"java多线程编程全集";s:7:"excerpt";s:325:"1.什么是多线程 简单的可以理解为多个线程同时执行多个任务,比如同时下载10个URL 的速度会比一个个下载快的多。 有兴趣深入研究原理可以学习下什么叫线程,进程 2.java多线程Thread方法小例子 extends Thread 的方式进行一次多线程实验 3.runable例子";s:9:"permalink";s:39:"http://localhost/blog/java-many-thread/";s:9:"post_date";s:19:"2014-06-28 09:50:42";s:10:"menu_order";i:8;}i:783;O:8:"stdClass":6:{s:2:"ID";i:783;s:10:"post_title";s:40:"顺序打印,经典java多线程例子";s:7:"excerpt";s:390:"java在2007年的时候编写过多线程爬虫,当时对多线程的理解仅仅限于可以同时并发任务,对于多线程之间的调度,完全没有理解。所以后来这的多线程的应用仅仅限于只能多线程并发任务。其实一切在线程中都可以被监控。 看下面的列子,我们来理解多线程之间如何进行控制的。 package com.javaer.t";s:9:"permalink";s:44:"http://localhost/blog/printabc-java-example/";s:9:"post_date";s:19:"2014-06-26 06:46:12";s:10:"menu_order";i:5;}i:120;O:8:"stdClass":6:{s:2:"ID";i:120;s:10:"post_title";s:37:"java多线程编程采用Thread继承";s:7:"excerpt";s:410:"java 多线程表示多个线程同时调动CPU,并行进行计算。一般情况了多线程会导致CPU升高。多线程的好处当然是并行计算,效率高。 常见的网络爬虫,如果你每次等待上个链接爬取完毕,下一个再开始,不是要等到天荒地老。所以多线程技术的运用,方便的解决了这个问题。 java多线程编程两个要点 1.类后面加个";s:9:"permalink";s:34:"http://localhost/blog/java-thread/";s:9:"post_date";s:19:"2012-07-25 11:51:18";s:10:"menu_order";i:3;}}
SELECT * FROM `wp_options` WHERE `option_name` LIKE '_transient_EG-Series-posts-500'

直接读取好了

$outid[] = $term_list[0]->term_taxonomy_id;
        	$outname[] = $term_list[0]->name;
        	$out_term_id[] =$term_list[0]->term_id;

return出来的数据多一个term_id列表

 return array($outidstr,$outnamestr,$out_term_id);
$term_idarr= $idall[2];
$term_id = $term_idarr[0];
echo $term_id;
$str = $wpdb->get_col("select option_value from $wpdb->options where option_name='_transient_EG-Series-posts-$term_id' ");
$list = unserialize($str[0]);

跑出来的结果和帖子里的列表顺序一致。但是和后台依然不一致。 感觉这个插件有天生的排序bug.

最终我在部署完毕以后,在我的网站发现了不同,代码读取的地方排序和后台一致了。帖子里不一致。说明帖子可能缓存了什么东西了。


This entry was posted in PHP and tagged , . Bookmark the permalink.
月小升QQ 2651044202, 技术交流QQ群 178491360
首发地址:月小升博客https://java-er.com/blog/sitebar-wordpress-topic/
无特殊说明,文章均为月小升原创,欢迎转载,转载请注明本文地址,谢谢
您的评论是我写作的动力.
2020.03.24 评论已经全局关闭,有事加QQ聊天