web-dev-qa-db-ja.com

WordPressに接続して、アップロードした写真を既存の写真の代替サイズとして保存する方法を教えてください。

サムネイル、中型、大型のサイズをすべて0に設定することで、メディア設定で画像のサイズ変更を無効にできます。

私のブログのすべての写真について、I upload 3つのサイズの同じ写真:

  1. FancyBox で使用するための、大きい/フルサイズの透かし入り画像、すべてのメタデータはそのまま
    • ファイル名 _large 。jpg(1200 x 800)
  2. サムネイル画像、透かしなし、 ImageOptim を使用して削除されたすべてのメタデータ
    • ファイル名。jpg(180x120)
  3. 網膜サムネイル、透かしなし、 ImageOptim を使用して削除されたすべてのメタデータ
    • ファイル名 _x2 。jpg(360x240)
  4. 後でもっともっとサイズ...

現在のところ、これらのそれぞれが wp_posts および wp_postmeta テーブルの別々のエントリを取ります。大きな写真からタイトルを取得し、2つのサムネイルに追加する" - Thumbnail"を追加する"Title Thumbnails"ボタンを追加するためにメディアアップローダーに接続しました。

私が欲しいのは、これらすべての画像についてデータベースに1つのエントリしかないことです。結局、同じ写真で、サイズが異なるだけです。

今のところ、私はすでにadd_attachmentアクションを使って次のようにIPTCキャプションを適切なフィールドに移動させています。

// fix our uploads by moving the caption to the proper field
add_action('add_attachment', function ($post_ID) {
    // this is triggered after an attachment is uploaded and before the attachment form gets displayed
    $post = get_post($post_ID);
    $post->post_excerpt = $post->post_content;
    $post->post_content = NULL;

    wp_update_post($post);
});

私の質問は、写真をアップロードするときにどうやってWordPressに接続するのですか(foo.jpg、foo_x2.jpgなど)。ライブラリ/データベースに新しいエントリを作成するのではなく、wp_postmetaテーブルのその写真の '_wp_attachment_metadata'キーを使用します。

価値があることに、データベースのwp_postsテーブルから、_large.jpgファイルが常に最初にアップロードされ、その後にサムネイルが続いていることがわかります。 (覚えておいてください、大きな写真はすべてのメタデータ(キャプション、タイトル、exif情報、IPTCなど)を持ったものです。私はこの遡及的なものにすることについても心配していません。 。

ありがとうございます。

6
DM.

これを使用して行うことができます。

wp_get_attachment_metadata();

wp_update_attachment_metadata();

あなたはそれのためのメタデータを手に入れ、それを変えてそれを保存します。取得した$ data配列には、sizesという名前の別の配列が含まれています。この配列には、添付ファイルに関連付けられているすべての異なるサイズの画像が含まれています。

便利な名前の画像をアップロードすると、これを自動的に更新します。それがなぜそれだけの価値があるのか​​よくわかりませんが、見てみましょう。

これには少し手間がかかりますが、これはおそらく最適な方法ではありませんが、うまく機能し、それをどのように行うことができるかについての考えを与えるでしょう。

// hooking in to the add_attachment action just like you did
add_action('add_attachment', function ( $post_ID ) {
    // we need to work with the database
    global $wpdb;

    // get the attachment
    $post = get_post( $post_ID );

    // remove the _x2 suffix to help find the original
    $attachment_name = str_replace( '_x2', '', $post->post_title );

    // did this file have an _x2 suffix?
    $is_x2 = ( $attachment_name == $post->post_title ) ? FALSE : TRUE;

    // get the attachments extension
    $extension = pathinfo( $post->guid, PATHINFO_EXTENSION );

    // if there is a large file, it would be called:
    $large_file = $attachment_name . '_large.' . $extension;

    // time to see if we have a large file saved
    // wordpress stores the relative path from the uploads directory
    // we use a like query to find the file in any year/month subdir
    $result = $wpdb->get_row($wpdb->prepare(
        "SELECT * FROM $wpdb->postmeta
            WHERE meta_value LIKE %s",
        '%' . $wpdb->esc_like($large_file)
    ));

    // did we find a file?
    if( !empty( $result ) ) {
        // yep we found a file, get its meta
        $attachment_meta = wp_get_attachment_metadata( $result->post_id );

        // get meta data on the new file
        $meta = get_post_meta( $post->ID, '_wp_attached_file', TRUE );

        // manually read the size of the new image
        $upl = wp_upload_dir();
        $new_file = $upl['basedir'] . '/' . $meta;
        $sizes = getimagesize( $new_file );

        // what should the thumbnail be called?
        // remember we checked if the file had the _x2 suffix before?
        $thumb_name = ( $is_x2 ) ? 'x2' : 'thumb';

        // time to add the new size to the meta data of the large file
        $attachment_meta['sizes'][$thumb_name] = array(
            'file' => basename($post->guid),
            'width' => $sizes[0],
            'height' => $sizes[1],
            'mime-type' => $sizes['mime']
        );

        // save the new meta data to the large file
        wp_update_attachment_metadata( $result->post_id, $attachment_meta );

        // now we delete all references to the new file that was uploaded
        // by manually deleting it from the database the file will be kept on disk
        // this step is optional, Wordpress will behave a bit funny when uploading if used
        $wpdb->query($wpdb->prepare(
            "DELETE FROM $wpdb->posts
                WHERE $wpdb->posts.ID = %d", 
            $post->ID
        ));

        $wpdb->query($wpdb->prepare(
            "DELETE FROM $wpdb->postmeta 
                WHERE $wpdb->postmeta.post_id = %d", 
            $post->ID
        ));        
    }
});

最後の2つの削除クエリはオプションです。新しい画像のデータベースに新しいエントリを追加する必要はなく、新しいエントリが削除されます。 Wordpressは、そのような参照が削除されることを好まないでしょう、それはアップロードするとき少し変に作用しますが、それは何も壊しません。

これで、他の人と同じようにサムネイルを簡単に取得できます。大きなファイルを注目の画像として投稿に添付したとします。

global $post;

// the filename_large.jpg file
echo get_the_post_thumbnail($post->ID);

// the filename.jpg file
echo get_the_post_thumbnail($post->ID, 'thumb');

// the filename_x2.jpg file
echo get_the_post_thumbnail($post->ID, 'x2');

新しい添付ファイルのメタデータを保存した$ thumb_name変数を使用して、サムネイルの呼び方を変更できます。

あなたがオプションの削除クエリを使用するかどうかにかかわらずこれは動作します、あなたが便宜のためにこれをしたいだけならそれから私はクエリを使用しないと言います。サムネイルを個々の画像として表示したくない場合は、それらを使用してください。

3
tobbr