Установить пост-миниатюру (с помощью php)?


Сайт, который я унаследовал, использует пользовательские поля для задания пути для миниатюр. В идеале я хотел бы переключить это, чтобы использовать встроенный пост-эскиз. Есть ли способ процедурно установить пост-миниатюру?

Спасибо

Author: Michael Watson, 2011-08-17

1 answers

Проблема будет заключаться в разнице в данных, необходимых для настройки миниатюры публикации (идентификатор вложения), и в том, что, вероятно, находится в пользовательском поле: URL.

Способ, который я собираюсь предложить, очень небрежен: добавляет больше вложений в WordPress. Лучшим способом может быть написание пользовательского SQL-запроса, в котором вы получаете идентификатор вложения из URL-адреса настраиваемого поля. Это работает, просто это может быть не лучшим способом.

Во-первых, получите все сообщения:

// get an array of all the posts
    $posts = get_posts(
        array( 
            'numberposts'   => -1,
            'post_type'     => 'post'
        )
    );

    // bail if our get_posts() call failed
    if( empty( $posts ) ) return;

Затем мы сделаем цикл через них, захватывая исходный URL-адрес изображения, затем вставляя его в качестве нового вложения. Наконец, мы обновим таблицу postmeta, чтобы отразить наш новый идентификатор миниатюры, и избавимся от старого настраиваемого поля миниатюр записей.

foreach( $posts as $p )
    {
        // change your old thumbnail key!
        $image_url = get_post_meta( $p->ID, 'your_old_thumbnail_key', true );

        // no thumbnail? on to the next
        if( empty( $image_url ) ) continue;

        // find our mime type for later
        $filetype = wp_check_filetype( $image_url );

        // Set up an array of args for our new attachment
        $args = array(
            'post_mime_type' => $filetype['type'],
            'post_title'     => esc_attr( $p->post_title ), // you may want something different here
            'post_content'   => '',
            'post_status'    => 'inherit'
        );

        // Insert the attachment!
        $thumb_id = wp_insert_attachment( $args, $image_url,  $p->ID );

        // gotta set up some meta data (height, width, etc)
        // our functions are int his file, so we have to include it
        require_once(ABSPATH . 'wp-admin/includes/image.php');
        $metadata = wp_generate_attachment_metadata( $thumb_id, $image_url );
        wp_update_attachment_metadata( $thumb_id, $metadata );

        // Finally! set our post thumbnail
        update_post_meta( $p->ID, '_thumbnail_id', $thumb_id );

        // Uncomment the next line to delete the old custom field
        //delete_post_meta( $p->ID, 'your_old_thumbnail_key', $image_url );
    }

Вот и все!

Вот он в виде плагина: http://pastie.org/2386814

 9
Author: chrisguitarguy, 2011-08-17 16:59:35