Php 防止通过事件日历WordPress插件导入重复事件

Php 防止通过事件日历WordPress插件导入重复事件,php,wordpress,Php,Wordpress,后台故事:我们使用事件日历中的事件聚合器插件通过cron作业导入事件。问题是,插件代码只检查UID——而提要提供程序是垃圾,并且每天更改一次“唯一”ID。所以我们疯狂地导入了重复事件 我想我不仅可以通过检查UID,还可以检查帖子标题、事件开始日期和事件结束日期来解决这个问题。这并不像我想象的那么容易,我将在下面记录原因。问题1:找到正确的钩子 事件日历对于外部开发人员没有太多好的操作/过滤器:它们主要用于内部使用。他们好心地建议我试试save\u post P>唯一的问题是,在 SaveEXP

后台故事:我们使用事件日历中的事件聚合器插件通过cron作业导入事件。问题是,插件代码只检查UID——而提要提供程序是垃圾,并且每天更改一次“唯一”ID。所以我们疯狂地导入了重复事件

我想我不仅可以通过检查UID,还可以检查帖子标题、事件开始日期和事件结束日期来解决这个问题。这并不像我想象的那么容易,我将在下面记录原因。

问题1:找到正确的钩子 事件日历对于外部开发人员没有太多好的操作/过滤器:它们主要用于内部使用。他们好心地建议我试试
save\u post

<> P>唯一的问题是,在<代码> SaveEXPOST 中间,我无法理解如何访问POST Meta,既没有事件日历的功能,也没有<代码> GETXPaseMeta >。< /P> 因此,我连接到了
更新后的元数据
添加的元数据
,如下所示:

函数检查\u更新时的\u重复事件\u($meta\u id、$post\u id、$meta\u key、$meta\u value){
//确保我们只处理我们感兴趣的元字段。
如果($meta_key!='\u EventEndDate'){
返回false;
}
如果(wp_是后修订($post_id)){
返回false;
}
如果(获取发布类型($post\u id)!=“部落事件”){
返回false;
}
如果(修剪($meta_值)=''){
返回false;
}
清除潜在的重复事件($post\u id);
}
添加动作('updated_post_meta','check_for_replicate_event_when_meta_updated',10,4);
添加动作('added_post_meta','check_for_replicate_event_when_meta_updated',10,4);
问题2:获得匹配的标题 提要提供程序还在提要标题中包含一些短划线,如下所示:

“某物-被-隔开-很多”

我使用了
get_the_title()
,这样我就可以将传入帖子的帖子标题与数据库中已有的内容进行比较。唯一的问题是,
获取标题()
将这些破折号字符转换为HTML实体,如下所示:

“有些东西——被——隔开——很多”

不过没什么大不了的,只要用
html\u entity\u decode
将它们转换回短划线字符就行了,对吗?错。这是我转换回字符串时它给我的结果:

“某物-被-隔开-很多”

它把我的该死的破折号变成了em破折号!现在我的SQL查询无法工作

我发现解决办法是暂时关闭
wp\u texturize
过滤器。下面是解决方案的后半部分:

函数清除潜在重复事件($post\u id,$post=null,$update=false){
if(DOING_CRON==false){
返回false;
}
如果($update==true){
返回false;
}
全球$wpdb;
$wpTextureSize=删除过滤器('the_title','wpTextureSize');
$title\u check=获取标题($post\u id);
如果($wptexturize){
添加_过滤器('the_title'、'wpturesize');
}
$start\u date\u check=get\u post\u meta($post\u id,''u EventStartDate',true);
$end_date_check=get_post_meta($post_id,''u EventEndDate',true);
$results=$wpdb->get_results(“从'wp_posts'中选择ID,在wp_posts.ID=wp_postmeta.post_ID,其中wp_postmeta.meta_值='start_date_check'和wp_posts.meta_值='end_date_check'和wp_posts.posts_标题='title_check');
如果(!空($results)){
wp_delete_post($post_id);
}
}
把所有的东西绑在一起 最后一部分,SQL查询非常简单:它搜索数据库以查看是否已经存在像导入的帖子这样的内容。如果查询在结果数组中返回ID,则事件很可能已经存在,而正在导入的事件将被删除

(希望这能为其他人节省很多时间和挫折。)