我已将这篇文章标记为 WordPress,但我不完全确定它是特定于 WordPress 的,所以我将它发布在 StackOverflow 而不是 WPSE 上。该解决方案不必是特定于 WordPress 的,只需 PHP 即可。
情景
我经营一个养鱼网站,里面有许多热带鱼Species Profiles
和Glossary
条目。
我们的网站以我们的个人资料为导向。正如您所说,它们是网站的基础。
我希望实现的是,在每个提到另一个物种或词汇表条目的物种概况中,我可以用链接替换这些词——比如你会在这里看到的。理想情况下,我也希望这也出现在新闻、文章和博客文章中。
我们几乎1400 species profiles
和1700 glossary entries
. 我们的物种概况通常很长,最后只计算我们的物种概况numbered more than 1.7 million words
信息。
我目前正在尝试
的目前,我有filter.php
一个功能 - 我相信 - 可以完成我需要它做的事情。代码很长,可以在这里找到完整的代码。
此外,在我的 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 Job 是答案吗?我可以设置一个.php
每天运行的文件,这不是问题。它如何确定需要过滤哪些帖子?它在运行时会对服务器产生什么影响?
或者,是 WordPress 管理页面的答案吗?如果我知道该怎么做,那么类似于页面的东西——利用 AJAX——允许我选择帖子来运行过滤器将是完美的。有一个叫做AJAX Regenerate Thumbnails
这样的插件,也许那会是最有效的?
注意事项
- 受到影响/读取/写入的数据库/信息的大小
- 过滤了哪些帖子
- 过滤器对服务器的影响;特别是考虑到我似乎无法将 WordPress 内存限制增加到 32Mb 以上。
- 实际过滤器本身是否高效、有效和可靠?
这是一个相当复杂的问题,我不可避免地(因为我在这个过程中被同事分心了大约 18 次)遗漏了一些细节。请随时向我询问更多信息。
提前致谢,