如果我只是从媒体库中插入了一个帖子,并且没有为它上传附件文件,我如何从帖子中捕获(使用get_post)附件文件(pdf,图像)?

时间:2014-01-03 作者:Manuel Ragazzini

我为我的英语感到抱歉。当我试图从帖子中检测到从库中插入的附件(在我的例子中是pdf文件)时,我在WP get\\U帖子中发现了一个奇怪的行为。这是我的代码:

$my_query_referenze = new WP_Query( array( \'category_name\' => \'referenze\', \'paged\' => get_query_var(\'paged\') ) );
                while ( $my_query_referenze->have_posts() ) : $my_query_referenze->the_post();
                    $content_referenze = apply_filters(\'the_content\', get_the_content());
                    $idpost = $my_query_referenze->post->ID ;
                    $args_referenze = array(
                        \'post_type\' => \'attachment\',
                        \'post_parent\' => $idpost,
                        \'numberposts\' => 1,
                        ); 
                    $attachments_referenze = get_posts($args_referenze);
                    if ( $attachments_referenze ) {
                        foreach ( $attachments_referenze as $attachment_referenze ) {
                            $indirizzoallegato_referenze= wp_get_attachment_url( $attachment_referenze->ID , false );
                        }
                    }
如果我上传了一个文件并附加了它,那么这个代码可以正常工作。如果我尝试从媒体库附加文件,则无法正常工作。

我找到了一个discussion in WP official forum 人们说这个案子没有解决办法,但这有可能吗?

在这两种情况下,难道没有办法捕捉到图像吗?

1 个回复
最合适的回答,由SO网友:gmazzap 整理而成

从帖子上载媒体时post_parent 属性设置为要从中上载的帖子ID。当您简单地从库中插入帖子时,情况并非如此:在这种情况下,如果媒体已连接到帖子,则其post_parent 已设置,并且一旦媒体只能有一个父级,you can\'t get the media using get_posts.

然而,有很多方法可以做到这一点。如果您的目标只是使用媒体的url输出一些内容,那么最好的选择可能是使用短代码。

如果您需要url来做一些事情,可以使用正则表达式从帖子内容中提取pdf url。

如果您使用的是WP 3.7+,则有一个函数wp_extract_urls 这对你完成任务有很大帮助。

在这里,我发布了一个通用函数,用于从帖子内容中提取URL,并通过其扩展收集URL:

function post_media_urls( $target = \'\' ) {
  if ( empty($target) )  {
    $target = get_the_content();
  } elseif ( is_numeric($target) ) {
    $post = get_post($target);
    $target = empty($post) ? FALSE : $post->post_content;
  }
  if ( empty($target) ) return false;
  // apply filters to support shortcodes
  $target = apply_filters(\'the_content\', $target);
  // extract urls
  $urls = wp_extract_urls( $content );
  $out = array();
  if ( ! empty($urls) ) {
    // parse only several media extensions, but allow filtering 
    $exts = apply_filters( \'post_media_urls_exts\', array(\'jpg\',\'gif\',\'png\',\'pdf\') );
    foreach( $urls as $url ) {
      $ext = strtolower( pathinfo( basename($url) , PATHINFO_EXTENSION ) );
      if ( $ext === \'jpeg\' ) $ext = \'jpg\';
      if ( ! empty($ext) && in_array( $ext, $exts) ) {
        if ( ! isset($out[$ext]) ) $out[$ext] = array();
        $out[$ext][] = $url;
      }
    }
  }
  return $out;
}
此功能可通过三种方式使用。首先是传递帖子id:

$urls = post_media_urls(10);
第二个是传递帖子内容(实际上是任何字符串):

$urls = post_media_urls($post->post_content);
第三个是在循环中使用它,没有任何参数,将用于当前的帖子内容:

$urls = post_media_urls();
在这三种情况下,您得到的都是URL的关联多维数组,其中第一级键是文件扩展名(小写),类似于:

Array(
  [pdf] => Array(
     [0] => \'http://example.com/wp-content/2014/01/sample.pdf\',
     [1] => \'http://example.com/wp-content/2014/01/sample2.pdf\'
  ),
  [jpg] => Array(
     [0] => \'http://example.com/wp-content/2014/01/sample.jpeg\',
     [1] => \'http://example.com/wp-content/2014/01/sample2.jpg\',
  ),
  [gif] => Array(
     [0] => \'http://example.com/wp-content/2014/01/sample.gif\',
  )
)
在您的示例中,函数的使用应如下所示:

$args = array( \'category_name\' => \'referenze\', \'paged\' => get_query_var(\'paged\') );
$my_query_referenze = new WP_Query( $args );
while ( $my_query_referenze->have_posts() ) : $my_query_referenze->the_post();
  $content_referenze = apply_filters(\'the_content\', get_the_content() );
  $attachments_referenze = post_media_urls();
  // to get only pdf
  if ( ! empty($attachments_referenze) && isset($attachments_referenze[\'pdf\']) ) {
    foreach ( $attachments_referenze[\'pdf\'] as $pdfurl ) {
      $indirizzoallegato_referenze = $pdfurl
    }
  }
endwhile;
当然可以使用此功能only if the media urls you want to retrive are inserted inside the post content.

An additional note. 该函数不解析所有URL,只解析以一组特定文件扩展名结尾的URL,这样会跳过任何web链接(例如到其他网站页面的链接)。我使用了一组非常有限的扩展,但我还插入了一个过滤器\'post_media_urls_exts\' 允许更改允许的扩展名。

结束

相关推荐

how to edit attachments?

在将例如文件附加到帖子时,如何在事后编辑/删除它们?在帖子编辑器中找不到任何内容。谢谢