用于自动设置已在使用的特色图像的功能

时间:2013-12-20 作者:markratledge

我甚至不知道从哪里开始搞清楚这件事

此函数用于函数。php获取帖子中的第一个附加图像,并将其设置为特色图像。问题是,如果图像已经附加到另一个帖子,它将不会附加图像。我已经测试过很多次了。

How can this function be changed to allow an image that is already attached to another post be set as the featured image on a new post?

    function wpse127196_auto_set_featured_image() {
              global $post;
              $featured_image_exists = has_post_thumbnail($post->ID);
                  if (!$featured_image_exists)  {
                  $attached_image = get_children(
"post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1" );
           if ($attached_image) {
                  foreach ($attached_image as $attachment_id => $attachment) {
                                set_post_thumbnail($post->ID, $attachment_id);
                                    }
                               }
                            }
          }
    add_action(\'save_post\', \'wpse127196_auto_set_featured_image\');
    add_action(\'draft_to_publish\', \'wpse127196_auto_set_featured_image\');
    add_action(\'new_to_publish\', \'wpse127196_auto_set_featured_image\');
    add_action(\'pending_to_publish\', \'wpse127196_auto_set_featured_image\');
    add_action(\'future_to_publish\', \'wpse127196_auto_set_featured_image\');

1 个回复
SO网友:gmazzap

首先,我不明白为什么需要挂接5个不同的操作:save_post 足够了:发布和更新后调用它。

之后,您发布的函数不会获取帖子内容中的图像,而是获取当前帖子的第一张子图像。

在以下情况下,图像是帖子的子级:

它是从帖子编辑屏幕上传的(通过帖子内容编辑器上方的“添加媒体”按钮)

  • 它是从媒体页面上传的,第一次插入帖子中,但是帖子和媒体之间的关系是一对多的:帖子可以有多个媒体子级,但媒体只能有一个父级。

    这就是为什么如果一个图像已经附加到一个帖子(它是帖子的子帖子)上,您的功能就无法工作,因为该图像不能是两个(或更多)帖子的子帖子。

    因此,如果您想在帖子内容中获取第一幅图像,您应该查看帖子内容并提取第一幅图像,然后从图像中获取图像id,最后将该id用作帖子缩略图。

    add_action(\'save_post\', \'wpse127196_auto_set_featured_image\', 10, 2);
    
    function wpse127196_auto_set_featured_image( $postid, $post ) {
      // do work only if there is no featured image already
      // and no need to rely on global post: the function receive
      // post id and post object as arguments
      if ( ! has_post_thumbnail($postid) ) {
         // get the url of first image in post content
         $image = wpse127196_get_first_image( $post->post_content);
         if ( ! empty($image) ) {
            // get the image id from the url
            $img_id =  wpse127196_get_img_id_from_url( $image );
            if ( (int) $img_id > 0 ) {
              // finally set post thumbnail
              set_post_thumbnail($postid, $img_id );
            }
         }
      }
    }
    
    如您所见,上述函数中使用了两个函数:wpse127196_get_first_imagewpse127196_get_img_id_from_url.

    第一种是从内容中提取图像,可以用不同的方式编写。可能最可靠的方法是使用html解析器(Google for it). 一种更简单但价格更低的方法是使用regex。

    为了简单起见,我将在此处使用regex:

    function wpse127196_get_first_image( $text = \'\' ) {
      if ( is_string($text) && ! empty($text) ) {
        $m = array();
        preg_match_all(\'#src=["\\\']([^"\\\']*\\.jpg|jpeg|gif|png)["\\\']#i\' , $text, $m);
        if ( isset($m[1]) && ! empty($m[1]) ) {
           $path = wp_upload_dir();
           foreach( $m[1] as $url ) {
             if ( false !== strpos( $url, $path[\'baseurl\'] ) ) { // skip external images
               return $url;
             }
           }
        }
      }
    }
    
    从url开始检索id的函数来自here

    function wpse127196_get_img_id_from_url( $url ) {
      $id = 0;
      if ( filter_var($url, FILTER_VALIDATE_URL) ) {
        $upload_dir_paths = wp_upload_dir();
        // skip external images
        if ( false !== strpos( $url, $upload_dir_paths[\'baseurl\'] ) ) {
          global $wpdb;
          // If this is the URL of an auto-generated thumbnail
          // get the URL of the original image
          $url = preg_replace( \'/-\\d+x\\d+(?=\\.(jpg|jpeg|png|gif)$)/i\', \'\', $url );
          // Remove the upload path base directory from the attachment URL
          $url = str_replace( $upload_dir_paths[\'baseurl\'] . \'/\', \'\', $url );
          // Finally, run a custom database query to get the attachment ID from URL
          $id = $wpdb->get_var( $wpdb->prepare(
            "SELECT wposts.ID FROM $wpdb->posts wposts, $wpdb->postmeta wpostmeta 
            WHERE wposts.ID = wpostmeta.post_id 
            AND wpostmeta.meta_key = \'_wp_attached_file\' 
            AND wpostmeta.meta_value = \'%s\' 
            AND wposts.post_type = \'attachment\'", $url
          ) );
         }
      }
      return $id;
    }
    

  • 结束

    相关推荐

    Featured Images for Tags?

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