用上传目录URL替换POST的所有图像URL

时间:2014-03-31 作者:Tom Oakley

在WordPress的一个客户网站上,他将发布包含大量图片的文章。保存/发布帖子时,我们需要能够将这些图像下载/保存到服务器,然后显示图像的URL,而不是显示原始URL,如上传目录中所示。

我选择通过在functions.php 然后将其添加为过滤器。以下是我迄今为止编写的代码:

function getpostimgs() {
  global $post; 
  $postContent = $post->post_content;

  preg_match_all( \'/<img.+src=[\\\'"]([^\\\'"]+)[\\\'"].*>/i\', $postContent, $matches );
  // match all images in post, add to array and then
  // get first array (the one with the image URLs in)
  $imgURLs = $matches[1];

  $upload_dir = wp_upload_dir(); // Set upload folder

  foreach ( $imgURLs as $imgURL ) {
    $image_data = file_get_contents( $imgURL ); // Get image data
    $filename = basename( $imgURL ); // Create image file name
    // check upload file exists and the permissions on it are correct
    if( wp_mkdir_p( $upload_dir[\'path\'] ) ) {
      $file = $upload_dir[\'path\'] . \'/\' . $filename . "-" . $post->ID . ".jpg";
    } else {
      $file = $upload_dir[\'basedir\'] . \'/\' . $filename . "-" . $post->ID . ".jpg";
    }
    // save file to server, with the filename of the image and then the post ID.
    file_put_contents( $file, $image_data ); // save the file to the server
    // find the occurence of each URL (within the post content)
    // that was in the array and replace them with the file link        
    preg_replace( "*" . $imgURL . "*", $file, $post->post_content );
  }
}

add_action(\'content_save_pre\', \'getpostimgs\');
我已经写了一些评论,希望这些行的解释足够让你理解发生了什么。

问题是,保存时(使用content_save_pre, 因此,它在保存到数据库之前会进行过滤),只需擦除所有内容即可。文件正在保存,我知道$matches[1] 是正确的(即有正确的图像链接),正如我用var_dump().

所以这有点问题preg_replace. 即使把所有的文件都拿出来preg_replace 使用一个简单的替换字符串(例如“Hello world”),它仍然不起作用(仍然只是擦除所有帖子内容)。有人知道为什么吗?

感谢您的帮助,希望我已经足够清楚了,很高兴提供更多信息或让它更清楚:)

1 个回复
SO网友:Chris_O

我有一个plugin that does this manually 在通过ajax的批处理过程中,我收到了很多关于如何使其自动化的请求。

这是加载帖子、将图像下载到上传目录并将其附加到帖子的功能。然后,它会搜索并替换旧的img URL,并将其替换为新的。将此附加到所有发布操作,您就可以开始了。

/**
 * Extracts all images in content adds to media library
 * if external and updates content with new url
 *
 * @param object $post The post object
 *
 */
function prefix_extract_external_images( $post ) {
  if ( ! is_object( $post ) ) {
    $post = get_post( $post );
  }
  $html = $post->post_content;
  $path = wp_upload_dir();
  $path = $path[\'baseurl\'];

  if ( stripos( $html, \'<img\' ) !== false ) {

    $regex = \'#<\\s*img [^\\>]*src\\s*=\\s*(["\\\'])(.*?)\\1#im\';
    preg_match_all( $regex, $html, $matches );

    if ( is_array( $matches ) && ! empty( $matches ) ) {
      $new = array();
      $old = array();
      foreach ( $matches[2] as $img ) {

        // Compare image source against upload directory
        // to prevent adding same attachment multiple times
        if ( stripos( $img, $path ) !== false ) {
          continue;
        }

        $tmp = download_url( $img );

        preg_match(
          \'/[^\\?]+\\.(jpg|JPG|jpe|JPE|jpeg|JPEG|gif|GIF|png|PNG)/\', $img, $matches
        );
        $file_array[\'name\'] = basename( $matches[0] );
        $file_array[\'tmp_name\'] = $tmp;
        // If error storing temporarily, unlink
        if ( is_wp_error( $tmp ) ) {
          @unlink( $file_array[\'tmp_name\'] );
          $file_array[\'tmp_name\'] = \'\';
          continue;
        }

        $id = media_handle_sideload( $file_array, $post->ID );

        if ( ! is_wp_error( $id ) ) {
          $url = wp_get_attachment_url( $id );
          array_push( $new, $url );
          array_push( $old, $img );
        }
      } // end foreach
      if ( ! empty( $new ) ) {
        $content = str_ireplace( $old, $new, $html );
        $post_args = array( \'ID\' => $post->ID, \'post_content\' => $content, );
        if ( ! empty( $content ) ) {
          $post_id = wp_update_post( $post_args );
        }       
      }
    } // end if ( is_array( $matches ) && ! empty( $matches ) )
  } // end if ( stripos( $html, \'<img\' ) !== false )
  return $post;
} // end function

$action_arrays = array( \'new_to_publish\', \'pending_to_publish\', \'draft_to_publish\' );

foreach ( $action_array as $action ) {
  add_action( $action, \'prefix_extract_external_images\' );
}
奖励:将找到的第一个图像设置为特色图像。

将此项添加到return $post 在上述函数中。

$atts = get_first_attachment( $post->ID );

foreach ( $atts as $a ) {
  $img = set_post_thumbnail( $post->ID, $a[\'ID\'] );
}
上述代码也需要此功能。

/**
 * Queries for attached images
 * @param int $post_id The post id to check if attachments exist
 * @return array|bool The 1st attached on success false if no attachments
 */
 function get_first_attachment( $post_id ) {
   return get_children( array (
     \'post_parent\'    => $post_id,
     \'post_type\'      => \'attachment\',
     \'post_mime_type\' => \'image\',
     \'posts_per_page\'  => (int)1
   ), ARRAY_A );
 }

结束

相关推荐

Featured Images for Tags?

是否可以以某种方式为标记或自定义分类创建特征图像。为了便于解释,我将给出一个可能的功能示例。假设我正在运行一个网站,发布城市中最好的餐厅。我的一些标签可能是伦敦、巴黎、纽约等等。。。我有一个页面可以抓取这些标签并按字母顺序排序。但不仅仅是文本,它还将有标签名(例如伦敦)和该城市的图像。我知道这可以手动完成,但通过将图像附加到标记或自定义分类法,可以使过程变得更简单,尤其是在处理大量标记/自定义分类法时。我认为这可能更像是一个抽象的问题,但我很好奇是否有人遇到过任何成功做到这一点的博客或网站。