如何将所有文件插入(但不是附加)到帖子中

时间:2017-12-12 作者:Levi Dulstein

如何在帖子中检索未连接媒体的ID?

我有两个帖子:POST APOST B 和一个名为file.pdf.

我已上传file.pdfPOST A 然后又将其插入POST B.

现在file.pdf 仍附加到POST A 所以我无法通过使用get_attached_media( \'\', $post_B_id ).

如何检索中使用的所有媒体的列表POST B, 包括“我的文件”等文件。pdf-未附加,通过插入POST B?

3 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

是的,你可以做到!它简单/容易吗?有点。。。它是否快速且可扩展?哦,天哪,不。

超级昂贵的解决方案这里的解决方案是这个函数:

$post_id = url_to_postid( $url );
问题是,这是一个非常慢的函数,调用起来很昂贵。如果在显示每篇帖子时都调用此选项,则DB服务器将处于超高压力下,除非正确配置并将其放置在专用机器上,否则可能会崩溃。

Note: 您不能提前调用此函数,它必须位于setup_theme 挂起或更高版本,否则将导致发生致命错误

有了这个功能,我们可以提取帖子内容中的每个URL,并进行测试,看看它是否以我们网站的URL开头。如果是,我们可以检查它是否与任何附件匹配,如果不匹配,则我们知道它是未连接的,可以使用此功能获取副本。

然而,如何检索帖子内容中的所有URL是一个主题或另一个问题。测试URL是否用于附加附件是一个简单的if语句比较循环(对于每个附加的内容,检查其URL是否与我们正在测试的URL匹配)

加快速度有一些事情可能会降低此功能的成本:

在save and update posts钩子上运行该过程,并将结果存储在post meta中,将该函数包装在缓存层中以加快速度(仅当有对象缓存解决方案(如memcached)时有效,而不像以前的机制那样有效)-使用由使用DB查询的Pippins插件编写的不太精确的方法。这将绕过缓存,而且仍然很贵,但没有缓存那么贵url_to_postid. 它也只适用于guid,因此准确度的权衡是一个更昂贵的解决方案,通过WP_Query 然后逐个检查每个附件,看看它们是否出现在您的帖子中。

这是迄今为止最慢、最昂贵的方法:

当你上传更多的媒体时,你必须在进行查询时加载更多的内容,对于任何有超过30或40个附件的网站,你都会出现内存不足的致命错误。这是一项繁重的数据库操作,你的数据库必须发送所有附件,如果你有几个人同时浏览,这将是一个很大的问题,它永远不会超过5-10个并发用户,如果你运气好的话,它很慢,检查每个附件都需要时间

SO网友:David Sword

您可以运行这样的功能,在帖子中查找并提取媒体

add_action(\'the_content\', function($content) {
    $mediaRegex = "/(src|href)=\\"(.+?).(jpg|png|pdf)\\"/i";
    $mediaFind = preg_match_all($mediaRegex, $content, $media);
    if (isset($media[2]) && count($media[2]) > 0)
        $content = "<pre>MEDIA WITHIN THIS PAGE: \\n".print_r($media[2],true)."</pre>".$content;
    return $content;
});
您可以修改regex模式以更好地适应您的设置。您可以让regex获取插入媒体的类名(而不是URL),并以这种方式检索附件ID。

和/或如果要进一步优化找到的媒体,确保其位于媒体库中,可以将媒体库中的媒体项目URL放入阵列中:

// get the media library for comparison
$library = array();
$args = array(      
    \'post_type\' => \'attachment\',
    //\'post_mime_type\' => \'image\', // if theres only one
    \'numberposts\' => -1,
    \'post_status\' => null,
    \'post_parent\' => null,
);
$attachments = get_posts($args);
foreach ($attachments as $post)
    $library[] = wp_get_attachment_url($post->ID);
然后编写一些代码来与以下内容进行争论in_array() 对于个人$media[2] 匹配vs$library. 根据使用情况,您可能需要添加Wordpress Transients 并包装库代码段。

SO网友:bueltge

要找到媒体文件的所有用法,很难得到简短的提示和源代码。WordPress创建了一个与帖子类型的用法关系。但您也有机会使用图库中的媒体文件、插件、主题、自定义代码等。

核心,在后端内默认的WordPress核心在后端的媒体区域内有一个选项。选择所有“未附加”文件,您将得到一个列表。enter image description here

替代插件

但是,您应该使用上面的核心解决方案,或者考虑使用一个插件来检查所有这些依赖关系,例如Media Cleaner. 我没有使用这个插件,但它会检查媒体文件的几种用法,并为您提供有关媒体文件的概述。

结束

相关推荐

Link to resized media file

我有一个WordPress网站,上面有现有的内容和图片。目前,帖子中的图像链接到原始媒体文件。我想对此进行修改,以便它们链接到图像的大小调整版本(例如,最大2000x2000像素)。最好,这应该由呈现页面时应用的一些过滤器来完成,这样我就不必编辑帖子中的现有链接。E、 g.,我想要这个:<a href=\"/wp-content/uploads/file.jpg\"><img ... /></a> 要转换为:<a href=\"/wp-content/u