Hi I’m using the smarty templating engine in wordpress to generate HTML like the one below:
<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>
The problem is that it seems like WordPress is removing the data attributes from this markup when the post is published. The markup above is what I actually got when I sent an email to myself.
$post_content = $smarty->fetch( 'product_detail.tpl' );
wp_mail('mymail@gmail.com', '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);
But when I edited the post that was published here’s what I got:
<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>
Its really weird. I don’t have an idea how it turned out to be like this.
But what’s even weirder is that this only happens when the post is published using a scheduled event which I trigger by calling it from AJAX. The code for the mons_post_product is the actual publishing of the post.
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');
When hook up the method in the admin_menu there’s no problem:
add_action('admin_menu', function(){
mons_post_product();
});
Any ideas?
Found the answer. I hope this would be useful to others that might have this problem in the future. All you have to do is remove the
content_save_pre
filter andcontent_filtered_save_pre
this will remove all Kses input form content filters.This works with
wp_insert_post
as well.I had the same issue, and the solution of Wern Ancheta worked for me BUT kses.
KSES is a recursive acronym which stands for âKSES Strips Evil Scripts”.
You don’t want to disable that, right?! Especially, when automatically working with external contents.
My problem was, I updated a certain post via cron and i also inserted some data attributes and they got stripped, when the cron run. Btw. this problem didn’t occur, when updating a custom field (update_post_meta), only on post_content (wp_update_post).
So the mission was, to make KSES accept my custom attributes, not to disable it.
So in the following solution KSES will not strip my custom
data-start
nordata-end
attributes on posts and pages, when found inside the<tr>
tag.