我已将此帖子标记为WordPress,但我不能完全确定它是特定于WordPress的,因此我将其发布在StackOverflow而不是WPSE上。
该解决方案不必特定于WordPress,只需使用PHP即可 。
方案
I我经营一个养鱼网站,上面有许多热带鱼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
,其工作原理如下,也许这是最有效的?
注意事项
这是一个非常复杂的问题,我不可避免地(因为我在此过程中被同事分心了18次)遗漏了一些细节。请随时调查我以获取更多信息。
提前致谢,
创建配置文件时执行此操作。
尝试逆转整个过程。而不是检查单词的内容,而是检查单词中内容的单词。
即使移出要检查的100,000个单词,您也应该能够轻松地将其保持在1秒以内。对于贝叶斯过滤器,我已经做到了这一点,并且没有缓存单词列表。
对于较小的列表,即使它是贪婪的并且收集了与“小丑”不匹配的单词,也会捕获“小丑泥the”,因此,较小的列表应该只有几到几十个带有链接的单词。查找和替换大量文本完全不需要时间。
以上内容并未真正解决您对较早配置文件的担心。您并没有确切地说有多少,只是说文本很多,而且是在1400至3100(两项)上。如果您有此信息,可以根据受欢迎程度来做这些较旧的内容。或输入的日期为最新的日期。无论如何,最好的方法是编写一个脚本来挂起PHP上的时间限制,而只对所有帖子批量运行加载/处理/保存。如果每个人花费大约1秒(可能要少得多,但最坏的情况),则您正在说的是3100秒,不到一个小时。
我们曾经轻松地通过控制台去使用 Posts.insert 来创建帖子并插入到数据库。但我们不可能指望用户去打开控制台来创建一个新的帖子吧? 所以我们需要在用户界面上创建一些表单控件,让用户在我们的 App 上发布一些新的帖子。 构建新帖子的提交页面 我们首先为新帖子的提交页面定义一个路由: Router.configure({ layoutTemplate: 'layout', loadi
如何防止用户在“JTextField”中输入某些字符,如果输入该字符,则不要在文本字段中显示它
问题内容: 我想为我的主页创建内容片段。一个示例帖子看起来像 在主页上,我只希望显示之前的内容。我在想可以在Jinja过滤器中使用Beautiful Soup来剪掉readmore及其后的所有内容。如果不存在,它应该剪切在第一个换行符或段落末尾。 我怎样才能做到这一点? 问题答案: 只需检查文本中是否存在或其他子字符串,然后在其上拆分,或者在换行符上不拆分该子字符串。
从采集内容中移除掉多余无用内容。 单元素采集场景 列表采集场景 很多时候我们采集回来的内容中会包含一些"杂质",如果只是想要移除或替换内容中的某些关键词,直接用字符串替换函数就可以轻松解决,但往往实际情况没这么简单,下面就是一个典型的例子: $html =<<<STR <div id="content"> <span class="tt">作者:xxx</span>
这是我在这里的第一篇帖子,而且我是一个初学者,所以请耐心听我说。 我想完成的是创建一个AJAX函数,该函数将以复选框的形式列出所有可用类别,用户可以从中选择。选择并点击“应用”后,我想显示分配给所选类别的帖子中所有标签的列表(也以复选框的形式)。然后用户可以从可用的标签中进行选择,然后在点击最后的“应用”按钮后,将显示相应的帖子。 类似于TED. com的“你感兴趣的是什么?”但是在AJAX中。所
问题内容: 我正在尝试创建一个名为groovy1.txt的文件,其内容为“使用Groovy方式处理文件很容易”。 注意:我不想使用外壳程序来创建此文件,而是想使用Groovy来实现。 我的詹金斯管道中有以下脚本。 但是它会抛出FileNotFound(权限被拒绝)错误,如下所示 问题答案: Jenkins Pipeline提供了可用于在作业的工作空间内写入文件的步骤。 看下面的例子: 运行此管道脚