WordPress正在删除计划发布的数据属性

时间:2013-04-26 作者:Wern Ancheta

您好,我正在使用wordpress中的smarty模板引擎生成HTML,如下所示:

<li>
 <div class="checkbox_container" data-asin="B0009Y7APU"><input type="checkbox" class="ecom_compare_products" data-asin="B0009Y7APU" value="B0009Y7APU"/>
 </div>
 <div class="small_img_container"><img class="related_product_image" src="img.jpg" alt="Case Logic JDS-2 USB Drive Shuttle 2-Capacity (Black/Blue)">
 </div>
 <div class="title_container"><a href="">Case Logic JDS-2 USB Drive Shuttle 2-Capacity (Black/Blue)</a>
 </div>
</li>
问题是,当发布文章时,Wordpress似乎正在从该标记中删除数据属性。上面的标记是我在给自己发送电子邮件时实际得到的。

$post_content = $smarty->fetch( \'product_detail.tpl\' );

wp_mail(\'[email protected]\', \'debug posting of products\', \'content: \' . $post_content);

$post = array(
    \'post_title\' => $item_name,
    \'post_content\' => $post_content,
    \'post_type\' => \'post\',
    \'tags_input\' => $amazon_keywords,
    \'comment_status\' => $allow_comments,
    \'ping_status\' => $allow_pingbacks,
    \'post_status\' => \'publish\'
);

wp_insert_post($post);
但当我编辑发表的帖子时,我得到的是:

 <li>
   <div class="checkbox_container"></div><div class="small_img_container">
   <img class="related_product_image" src="img.jpg" alt="Case Logic JDS-2 USB Drive Shuttle 2-Capacity (Black/Blue)">
   </div>
   <div class="title_container">
    <a href="">Case Logic JDS-2 USB Drive Shuttle 2-Capacity (Black/Blue)</a>
   </div>
  </li>
真的很奇怪。我不知道结果是怎样的。但更奇怪的是,只有在使用预定事件发布帖子时才会发生这种情况,我通过从AJAX调用该事件来触发该事件。mons\\u post\\u产品的代码是文章的实际发布。

add_action(\'ecom_scheduler\', \'mons_post_product\');

function ecom_schedule_event(){

    wp_schedule_single_event(time(), \'mons_scheduler\');
}

add_action(\'wp_ajax_schedule\', \'mons_schedule_event\');
add_action(\'wp_ajax_nopriv_schedule\', \'mons_schedule_event\'); 
在admin\\u菜单中连接方法时,没有问题:

add_action(\'admin_menu\', function(){
  mons_post_product();
});
有什么想法吗?

2 个回复
最合适的回答,由SO网友:Wern Ancheta 整理而成

找到了答案。我希望这对将来可能有此问题的其他人有用。您只需删除content_save_pre 过滤器和content_filtered_save_pre 这将删除所有Kses输入表单内容筛选器。

//temporarily disable
remove_filter(\'content_save_pre\', \'wp_filter_post_kses\');
remove_filter(\'content_filtered_save_pre\', \'wp_filter_post_kses\');

wp_update_post($post);

//bring it back once you\'re done posting
add_filter(\'content_save_pre\', \'wp_filter_post_kses\');
add_filter(\'content_filtered_save_pre\', \'wp_filter_post_kses\');
这适用于wp_insert_post

SO网友:honk31

我也有同样的问题,Wern Ancheta的解决方案对我有效,但kses除外。

KSES是一个递归的首字母缩略词,代表“KSES剥离邪恶脚本”。你不想禁用它,对吧?!尤其是在自动处理外部内容时。

我的问题是,我通过cron更新了一篇帖子,还插入了一些数据属性,当cron运行时,它们被剥离了。顺便说一句,在更新自定义字段(update\\u post\\u meta)时,仅在post\\u内容(wp\\u update\\u post)上出现此问题。

因此,任务是让KSE接受我的自定义属性,而不是禁用它。

因此,在以下解决方案中,KSES不会剥夺我的自定义data-start 也没有data-end 当在<tr> 标签

function jnz_add_kses_attributes($allowed, $context){
  if (is_array($context)) {
    return $allowed;
  }

  if ($context === \'post\' || $context === \'page\') {
    $allowed[\'tr\'][\'data-start\'] = true;
    $allowed[\'tr\'][\'data-end\'] = true;
  }
  return $allowed;
}
add_filter(\'wp_kses_allowed_html\', \'jnz_add_kses_attributes\', 10, 2);

结束

相关推荐

Multiple Page Templates & CSS

在使用多个页面模板的主题上处理CSS的最佳实践是什么?例如:我将有一个全宽页面模板和一个两列页面模板。最好只在单个CSS中调用容器(#fullWidthContainer vs.#twoColumnContainer)还是为每个页面模板提供单独的CSS文件更好?