情景
我运行了一个fishkeeping website与一些热带鱼种类和词汇表条目.
我们的网站是围绕我们的个人资料.正如你所说,它们是网站的面包和黄油.
我希望实现的是,在提及另一个物种或词汇表条目的每个物种资料中,我可以用链接替换这些词,例如你会看到here.理想情况下,我也会这样发生在新闻,文章和博客帖子.
我们有近1400种物种资料和1700个词汇表.我们的物种资料通常很冗长,最后我们的物种资料总计超过170万字的信息.
我正在尝试什么
目前,我有一个filter.PHP的功能,我相信 – 做我需要做的.代码相当冗长,可以在here全部找到.
另外,在我的wordpress主题的functions.PHP中,我有以下内容:
# ============================================================================================== # [Filter] # # Every hour,using WP_Cron,`my_updated_posts` is checked. If there are new Post IDs in there,# it will run a filter on all of the post's content. The filter will search for Glossary terms # and scientific species names. If found,it will replace those names with links including a # pop-up. include "filter.PHP"; # ============================================================================================== # When saving a post (new or edited),check to make sure it isn't a revision then add its ID # to `my_updated_posts`. add_action( 'save_post','my_set_content_filter' ); function my_set_content_filter( $post_id ) { if ( !wp_is_post_revision( $post_id ) ) { $post_type = get_post_type( $post_id ); if ( $post_type == "species" || ( $post_type == "post" && in_category( "articles",$post_id ) ) || ( $post_type == "post" && in_category( "blogs",$post_id ) ) ) { //get the prevIoUs value $ids = get_option( 'my_updated_posts' ); //add new value if necessary if( !in_array( $post_id,$ids ) ) { $ids[] = $post_id; update_option( 'my_updated_posts',$ids ); } } } } # ============================================================================================== # Add the filter to WP_Cron. add_action( 'my_filter_posts_content','my_filter_content' ); if( !wp_next_scheduled( 'my_filter_posts_content' ) ) { wp_schedule_event( time(),'hourly','my_filter_posts_content' ); } # ============================================================================================== # Run the filter. function my_filter_content() { //check to see if posts need to be parsed if ( !get_option( 'my_updated_posts' ) ) return false; //parse posts $ids = get_option( 'my_updated_posts' ); update_option( 'error_check',$ids ); foreach( $ids as $v ) { if ( get_post_status( $v ) == 'publish' ) run_filter( $v ); update_option( 'error_check',"filter has run at least once" ); } //make sure no values have been added while loop was running $id_recheck = get_option( 'my_updated_posts' ); my_close_out_filter( $ids,$id_recheck ); //once all options,including any added during the running of what could be a long cronjob are done,remove the value and close out delete_option( 'my_updated_posts' ); update_option( 'error_check','working m8' ); return true; } # ============================================================================================== # A "difference" function to make sure no new posts have been added to `my_updated_posts` whilst # the potentially time-consuming filter was running. function my_close_out_filter( $beginning_array,$end_array ) { $diff = array_diff( $beginning_array,$end_array ); if( !empty ( $diff ) ) { foreach( $diff as $v ) { run_filter( $v ); } } my_close_out_filter( $end_array,get_option( 'my_updated_posts' ) ); }
这个工作方式(希望)由代码的意见描述,是每个wordpress每小时运行一个cron工作(这就像一个假cron – 在用户点击上工作,但并不重要,因为时机不是重要的),它运行上面找到的过滤器.
每小时运行一次的理由是,如果我们在每个职位被保存时试图运行它,这将对作者造成不利影响.一旦我们收到客人的作者,这显然不是一个可以接受的方式.
问题…
几个月以来,我一直在使这个过滤器运行可靠的问题.我不认为问题在于过滤器本身,而是使用过滤器的功能之一,例如cron作业,或者选择过滤哪些帖子的功能,还是为单词列表等准备的功能过滤器.
不幸的是,诊断问题是非常困难的(我可以看到),感谢它在后台运行,只有在小时的基础上运行.我一直在尝试使用wordpress的update_option函数(它基本上写了一个简单的数据库值)进行错误检查,但我没有太多的运气 – 说实话,我很困惑的是,问题在哪里.
我们最终将网站存在,无需此过滤器正常工作.有时它似乎工作,有时它不.因此,我们现在有很多物种资料没有被正确过滤.
我想要什么
我基本上是寻求关于运行此过滤器的最佳方式的建议.
是Cron工作的答案吗?我可以设置每天运行的.PHP文件,这不会是一个问题.如何确定哪些职位需要过滤?它在运行时对服务器有什么影响?
或者,是wordpress管理页面的答案吗?如果我知道如何做到这一点,那么使用AJAX(允许我选择帖子来运行过滤器)的页面的一些东西将是完美的.有一个名为AJAX Regenerate Thumbnails的插件,这样做可能是最有效的?
注意事项
>受影响/读/写数据库/信息的大小
>哪些帖子被过滤
>过滤器对服务器的影响;特别是考虑到我似乎无法增加wordpress内存限制超过32Mb.
实际过滤器本身是否高效,有效可靠?
这是一个相当复杂的问题,我不可避免地(在过程中我被同事分心了大约18次),省略了一些细节.请随时查询我的进一步信息.
提前致谢,
尝试扭转整个过程.而不是检查内容的单词,检查内容的单词的单词.
>打破内容发表的内容(空格)
>删除重复的数据库中的一个单词的最小尺寸的数据库,一个最大的大小,一个在你的常用单词列表中.
>检查每个表格,如果您的某些表格包含带空格的短语,请执行%text%search,否则直接匹配(更快),甚至构建哈希表,如果它真的是一个大问题. (我会做一个PHP数组,并以某种方式缓存结果,没有意义重新发明的轮)
>使用现在更小的列表创建您的链接.
即使你搬出了十万个单词,你也可以轻松保持在1秒以内.我已经做了这个,没有缓存单词列表,以前的贝叶斯过滤器.
有了较小的列表,即使是贪婪而且收集不符合“小丑”的单词将会捕捉到“小丑泥ach”,所产生的较小的列表应该只有几到几十个字与链接.这将不需要时间去做一个文字的查找和替换.
以上并没有真正解决您对旧版配置文件的关注.你没有说出确实有多少,只是有很多的文本,它是在1400到3100(两个项目)放在一起.如果你有这个信息,你可以根据受欢迎程度来做这些较旧的内容.或输入的日期,最新的.不管最好的方法是编写一个脚本来暂停PHP的时间限制,只需批量运行所有帖子的加载/进程/保存.如果每个人需要大约1秒钟(可能要少得多,但最糟糕的情况),你说的是3100秒,这是一个小于一小时.