我正在使用wp_cron
从远程网站自动抓取帖子并将其保存在我的wp db中。
NOTICE! I am executing my code from my plugin, not from my template functions.php or somewhere else. I have my own validation of grabbed content to prevent malicious code etc. so turning off security validation in wordpress is not an issue in my case, but be careful if you don\'t have your own validation of grabbed content. Always validate grabbed values if possible!
我的插件中有一个按钮,点击这个按钮可以手动抓取帖子,效果非常好。所有内容都按我的需要存储在数据库中。这里没问题。
但是我有一个wp_cron
每两分钟运行一次用于测试目的的函数(当然,如果有人单击我的页面;)这里有一个问题。
请注意,代码是相同的,只是get_user_id()
我手动设置为1
. 这可能是这两种代码之间唯一的变化。
问题是,所有内容都按预期存储,包括时间、标题、slug(它甚至可以抓取和下载并正确设置帖子的特征图像)、标签、类别和其他分类法。所以很好。
唯一缺少的是帖子的正文(内容)。
从管理员手动下载时。有点像:
<iframe width="650" scrolling="no" height="450" frameborder="0" src="http://example.com/embedframe/3843634"></iframe>
或
<object height="450" width="650" ><param name="movie" ... bla bla bla ... shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" height="450" width="650" /></object>
所以,这是因为它是经过过滤和剥离的,我的意思是
object
和
iframe
未以管理员身份登录时?
如果是这样,我如何在插件中关闭它?
还是别的什么?
我真的认为这只是WP安全问题,因为代码在从admin作为admin手动执行时可以工作。函数的代码是相同的,所有变量都按预期传入。只保存内容。
EDIT:
这绝对是something with the WP security. 当我在自动cron函数中手动将内容变量设置为“Testing auto save”时is正常保存。但当我设定为<iframe>something</iframe>
或<object>blablabal</object>
事实并非如此。
How to turn this "checking" off, so I can save my code with cron?
有什么想法吗?
SO网友:Otto
不要像这样手动移除安全过滤器,只需为这些进程设置正确的用户即可运行。
手动登录并运行进程时,您已登录,因此您的凭据正在使用,权限正在使用。我打赌你是这个网站的管理员。您有权发布未过滤的html,这意味着您可以发布iFrame和对象以及任何您喜欢的内容。
当cron作业运行时,它没有您的凭据。因此,它没有获得相同的权限。因此,安全过滤器被打开,像iFrame之类的东西被阻塞。
要修复它,您需要更改进程,而不是禁用过滤器,而是在运行时运行。因此,请在数据库中查找您的用户ID号,并在执行导入的进程运行之前,添加以下代码:
wp_set_current_user( 123 );
其中“123”是您的用户ID号。然后代码现在将是“你”,并且可以像你那样做。这些筛选器不会生效,因为当前用户的权限是正确的。
注意:顺便说一句,这并不安全。您仍然允许一些远程网站在您的网站上插入可能存在危险的内容。所以你相信他们不会把你弄到这里来。记住这一点。这种方法比手动摆弄过滤器更简单。
SO网友:Derfder
WARNING !!!
Always make validation of the data you are saving into the database! This answer below assumes that you validate the content of your post inside of your custom function that you trigger via cron!
我找到了剥离iframe和object标记的解决方案。
NOTICE! Put this only in your plugin\'s function code that is run via wp cron. Don\'t put it in your function.php in your template or in other places.
// before saving post
remove_filter(\'content_save_pre\', \'wp_filter_post_kses\');
remove_filter(\'content_filtered_save_pre\', \'wp_filter_post_kses\');
// save code here
// after saving post
add_filter(\'content_save_pre\', \'wp_filter_post_kses\');
add_filter(\'content_filtered_save_pre\', \'wp_filter_post_kses\');
IMPORTANT!通过使用前缀
content_
我们正在限制
remove filter -> save our data -> add_filter
只处理内容,而不是评论、摘录等。
SO网友:Tom J Nowell
使用短代码,例如创建iframe短代码,然后您可以执行以下操作:
[iframe]example.com[/iframe]
下面是实现这种短代码的代码:
add_shortcode(\'iframe\', array(\'iframe_shortcode\', \'shortcode\'));
class iframe_shortcode {
function shortcode($atts, $content=null) {
extract(shortcode_atts(array(
\'url\' => \'\',
\'scrolling\' => \'no\',
\'width\' => \'100%\',
\'height\' => \'500\',
\'frameborder\' => \'0\',
\'marginheight\' => \'0\',
), $atts));
if (empty($url)) return \'<!-- Iframe: You did not enter a valid URL -->\';
return \'<iframe src="\'.$url.\'" title="" width="\'.$width.\'" height="\'.$height.\'" scrolling="\'.$scrolling.\'" frameborder="\'.$frameborder.\'" marginheight="\'.$marginheight.\'"><a href="\'.$url.\'" target="_blank">\'.$url.\'</a></iframe>\';
}
}
用法:
[iframe url="http://wpsnipp.com" width="100" height="100" scrolling="yes" frameborder="1" marginheight="2"]
资料来源:
http://wpsnipp.com/index.php/functions-php/iframe-shortcode-for-posts-and-pages/
如果需要插入对象嵌入,则说明出现了问题。使用OEmbed或设计短代码