将第一张图像(外部)设置为特色图像/缩略图

时间:2012-07-01 作者:nucci

我现在已经阅读了很多代码片段,似乎我太愚蠢了,还是没有解决这个问题的方法。

我有一个设置,如果我在创建帖子时在元框中输入ASIN代码,那么就可以通过亚马逊API加载产品的一些信息。当我保存帖子时,亚马逊产品图片会自动显示在帖子中。但它并没有附在帖子上。它从亚马逊网站加载。

现在我想自动设置特色图像/缩略图。我能想到的两个选择是:

选项1。当我保存帖子时,productimage会上传/附加到帖子,然后以某种方式设置为特色图片。

选项2。发布帖子时,将对其进行扫描,并将标签中的第一个元素设置为特征图像。

我真的不知道从哪里开始!(显然,我也愿意接受其他方法)

编辑:

我找到了这个代码,但不知道从哪里开始。你觉得合适吗?我应该把它放在哪里?

/** Set Featured Image **/
// required libraries for media_sideload_image

function featuredimagesetter($post_id)
{ 
require_once(ABSPATH . \'wp-admin/includes/file.php\'); 
require_once(ABSPATH . \'wp-admin/includes/media.php\'); 
require_once(ABSPATH . \'wp-admin/includes/image.php\'); 

$post_id == how do I set this?;
$image_thumb_url == \'http://www.examplesite.com/exampleimage.jpg\';

// load the image 
$result = media_sideload_image($image_thumb_url, $post_id, \'image_thumbnail\'); 

// then find the last image added to the post attachments 
$attachments = get_posts(array(\'numberposts\' => \'1\', \'post_parent\' =>     $post_id, \'post_type\' => \'attachment\', \'post_mime_type\' => \'image\', \'order\' => \'ASC\')); 


if(sizeof($attachments) > 0){ 
    // set image as the post thumbnail 
    set_post_thumbnail($post_id, $attachments[0]->ID); 
} 
add_action(\'save_post\',\'featuredimagesetter\');
}
这可能会将特征图像设置为我设置的图像。但如果这样做行得通,我想将image设置为变量而不是imagepath也没什么大不了的。但我仍然不知道如何正确设置$pot\\u id,以及整个代码是否应该工作,以及我必须将其放在哪里。

2 个回复
SO网友:Chris_O

我最近发布了一个插件,可以导入帖子中找到的任何外部图像,并将其导入媒体库,将其附加到帖子中,并将找到的第一个图像设置为特色图像。

http://wordpress.org/extend/plugins/media-tools/

我正在发布获取外部图像并将其设置为特征图像的基本函数。在插件中,这是通过ajax的管理页面完成的,但正如Milo在回答中提到的,您可以将其添加到save\\u post挂钩中。

function process_image() {
    $response = \'\';
    $data[] = \'\';
    $error = 0;

    $img = $this->extract_image( $post );
        if( empty( $img ) ) {
            $response .=  \'No images found <br>\';
            die( sprintf( $response . \'<br>Media tool complete (Post ID %1$s) in %2$s seconds. %3$d errors\', esc_html( $post->ID ), timer_stop(), $error = $error  > 0 ? $error : \'no\' ) );
         }

    /** @var $file string or WP_Error of image attached to the post  */
    $file = media_sideload_image( $img, (int)$post->ID );
    if ( is_wp_error( $file ) ) {
        $response .= \'<span style="color:red">Upload Error: Could not upload image. Check for malformed img src url</span><br>\';
        $error++;
    } else {
        $atts = $this->get_attach( $post->ID );
        foreach ( $atts as $a ) {
           $img = set_post_thumbnail( $post->ID, $a[\'ID\'] );
           if ( $img ) {
              $thumb = wp_get_attachment_thumb_url( $a[\'ID\'] );
              $response .= \'<img src="\'.esc_url( $thumb ).\'" /><br>\';
              $response .= \'<a href="\' . wp_nonce_url( get_edit_post_link( $a[\'ID\'], true ) ) . \'" >\' . get_the_title( $a[\'ID\'] ) . \'</a>  Set as Featured Image</p><br>\';
       }
    }
    unset( $atts );
    unset( $a );
    }
    return $response;
}
这并不意味着要复制和粘贴。这是一个如何做到这一点的示例,代码需要根据您的具体情况进行调整。这段代码位于一个类中,在我的插件中通过ajax返回$response变量。

在上述代码中调用的用于提取图像的函数:

/**
 * Extracts the first image in the post content
 * @param object $post the post object
 * @return bool|string false if no images or img src
 */
function extract_image( $post ) {
    $html = $post->post_content;
    if ( stripos( $html, \'<img\' ) !== false ) {
        $regex = \'#<\\s*img [^\\>]*src\\s*=\\s*(["\\\'])(.*?)\\1#im\';
        preg_match( $regex, $html, $matches );
        unset( $regex );
        unset( $html );
        if ( is_array( $matches ) && ! empty( $matches ) ) {
            return  $matches[2];

        } else {
            return false;
        }
    } else {
        return false;
    }
}
调用获取附件的get\\u attach函数:
/**
 * 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_attach( $post_id ) {
    return get_children( array (
            \'post_parent\'    => $post_id,
            \'post_type\'      => \'attachment\',
            \'post_mime_type\' => \'image\',
            \'posts_per_page\'  => (int)1
        ), ARRAY_A );
}

SO网友:Milo

我不熟悉Amazon API,但如果您能熟练使用php,就可以实现这一点。

这是save_post 钩子,如果您熟悉元框的工作方式,您也应该熟悉。

我假设您可以使用该亚马逊产品编号获取图像。将其通过media_handle_sideload() 功能,然后add post meta 使用元密钥_thumbnail_id 以及返回的附件ID,以将该图像设置为特色图像。

结束

相关推荐

Featured Images on Front Page

我目前有一个静态首页和一个/博客。我的目标是让头版成为手工选择的图像网格(类似于公文包)。我希望能够轻松切换此页面上的图像,而无需更改原始html。最好的方法是在页面上使用自定义字段吗?还是有更好的方法来管理静态页面上的特色图像?谢谢