更新一篇帖子而不用转义和符号?

时间:2015-04-27 作者:rinogo

我发现了wp_update_post() 逃逸邮件中提供的所有符号post_content. 我正在尝试更新一篇帖子,但没有将符号转换为&. (我需要向post_content 员额领域)。所以,我想找到一种方法wp_update_post() 禁用转义,或者替换另一个函数。

一种方法是锻炼$wpdb 直接,但我宁愿不要,因为这似乎是我最后的选择。

我所做的一个观察是,如果您使用“文本”视图通过管理界面编辑帖子,您可以成功地将符号添加到post\\u内容中,而无需将其转换为&. 然而,我花了一些时间来跟踪代码,以了解Wordpress是如何实现这一点的。有人知道WP是如何做到这一点的吗?

最终,我的问题是,what\'s the best way to update a post with ampersand escaping "disabled"?

3 个回复
SO网友:Bassel Banbouk

没错,管理部分中的更新不会更改&& 而wp\\u update\\u post()函数(可在/wp-includes/post.php 第3772行),但仅当用户不具备unfiltered_html, 让我解释一下我是如何发现这一点的,以及我的建议。

我对此进行了一些跟踪,发现wp\\u update\\u post()在内部调用wp\\u insert\\u post(),如第3820行所示

return wp_insert_post( $postarr, $wp_error );
wp\\u insert\\u post()在第3227行调用sanitize\\u post()

$postarr = sanitize_post( $postarr, \'db\' );
然后在第2176行,此过滤器更改&&

$value = apply_filters( "{$field_no_prefix}_save_pre", $value );
特别是有一个名为content_save_pre 或者对我来说title_save_pre 因为我面临着与标题相同的问题。

现在,转到使用/wp-admin/post.php

您可以在第205行看到实际保存

$post_id = edit_post();
以及edit_post() 函数可在下找到/wp-admin/includes/post.php 在线208

function edit_post( $post_data = null ) {
实际更新在第382行完成

$success = wp_update_post( $post_data );
这表明Wordpress在内部使用相同的wp\\u update\\u post()函数。

事实证明,有一个名为“wp\\u filter\\u kses”的过滤器,Wordpress管理员没有使用它,这起到了很大的作用。尽管您可以使用以下方法删除它:

remove_filter(\'content_save_pre\', \'wp_filter_kses\');
或者对我来说

remove_filter(\'title_save_pre\', \'wp_filter_kses\');
或者如@rinogo所述,您可以使用kses\\u remove\\u filters()删除所有kses过滤器。

但是,这些过滤器由/wp-includes/kses.php 检查用户是否具有“unfiltered\\u html”功能后,在线1934

    if ( ! current_user_can( \'unfiltered_html\' ) ) {
    kses_init_filters();
    }
如果kses_init_filters() 调用,则尝试更新帖子的用户没有足够的信任,并且没有适当的功能。

我建议正确处理身份验证,而不是删除过滤器。

SO网友:rinogo

我不确定WP的管理界面如何处理这个问题(例如,我在问题中引用的场景),但我找到了一种方法来实现这一点:

//Disable KSES
kses_remove_filters();          

$update_rval = wp_update_post($updates);

//Reenable KSES
kses_init_filters();
请注意,“kses”函数是Wordpress防御邪恶代码的一部分。因此,使用这种方法的风险自负。KSES做了很多事情,而不仅仅是逃避符号。如果$updates 包含可信数据(如我的情况),使用这种方法可能是安全的。

更新:我遇到了另一个场景,Wordpress正在愉快地运行我的JS,但仍在逃避符号。。。我设法通过替换String.fromCharCode(38) 对于每个& URL中需要的字符。

SO网友:ggedde

谢谢@Basil,你的回答帮助了我,但我所需要做的不是改变过滤器,而是向出现此问题的用户角色添加“unfiltered\\u html”功能。

结束

相关推荐

Split posts between databases

我的客户要求为基于WP的wordpress(单站点,而不是多站点)提供一个非常具体的解决方案。基本上,他想要的是,假设在1000篇文章之后,应该创建新的数据库(只有5个表,posts,posmeta和3个与分类相关的表),新的文章应该和所有的post meta一起存储在这个数据库中,直到它达到1000篇文章,然后处理重复。具有挑战性的部分是,所有这些数据库必须同时处于活动状态,因此WP应该能够同时访问来自主数据库和所有这些新创建的数据库(有5个表)的帖子。这可能需要hyperdb. 问题包括:如何告诉wp