web-dev-qa-db-ja.com

アップロード時の注目画像と投稿画像の区別

注目の画像と投稿画像を区別したい。

計画は注目の画像に複数のサイズを与えることですが、投稿の中にある/接続されている画像はデフォルトサイズのみが必要です。

intermediate_image_sizesを使用して、どのカスタム投稿タイプがどの画像サイズに割り当てられるかをフィルタリングすることができます。

/** Don't Make Extra Sizes **/
function post_type_sizes( $image_sizes ){
    $post_type_size_array = array('icon', 'med-thumb', 'large', 'full');
    $post_image_sizes = array('thumbnail', 'medium', 'large', 'full');

    if( isset($_REQUEST['post_id']) && 'cpt_test' === get_post_type($_REQUEST['post_id']) )
        return $post_type_size_array;
    else
        return $post_image_sizes;

    return $image_sizes;
}
add_filter('intermediate_image_sizes', 'post_type_sizes', 999 ); 

しかし、おすすめ画像には複数のカスタムサイズのみを指定し、TinyMCEのデフォルトサイズ(サムネイル、中、大、フル)にアップロードされた投稿は残しておきます。

5
Howdy_McGee

_thumbnail_idのメタ値をフィルタリングすることでこれを行うことができます。

add_filter( 'update_post_metadata', 'generate_featured_image_sizes', 10, 5 );
add_filter( 'add_post_metadata', 'generate_featured_image_sizes', 10, 5 );

function generate_featured_image_sizes( $check, $object_id, $meta_key, $meta_value, $unique_or_prev ) {
    if ( $meta_key == '_thumbnail_id' ) {

        // regenerate previous featured image thumbs if it exists
        if ( false !== ( $prev_thumb_id = get_post_meta( $object_id, '_thumbnail_id', true ) ) ) {
            $prev_new_metadata = wp_generate_attachment_metadata( $prev_thumb_id, get_attached_file( $prev_thumb_id ) );
            if ( ! is_wp_error( $prev_new_metadata ) )
                wp_update_attachment_metadata( $prev_thumb_id, $prev_new_metadata );
        }

                    // remove all normal image sizes before we add our filter
                    cleanup_attachment_images( $meta_value );

        // filter image sizes for featured
        add_filter( 'intermediate_image_sizes', 'featured_image_sizes', 9999 );

        // regenerate thumbnails for featured
        $new_metadata = wp_generate_attachment_metadata( $meta_value, get_attached_file( $meta_value ) );
        if ( ! is_wp_error( $new_metadata ) )
            wp_update_attachment_metadata( $meta_value, $new_metadata );

                    // remove featured sizes from previous featured image
                    if ( isset( $prev_thumb_id ) && $prev_thumb_id )
                        cleanup_attachment_images( $prev_thumb_id );

        // tidy up
        remove_filter( 'intermediate_image_sizes', 'featured_image_sizes', 9999 );
    }

    return $check;
}

function featured_image_sizes( $sizes ) {
    return array( 'large', 'featured', 'slider' );
}

function cleanup_attachment_images( $attachment_id ) {
    $uploadpath = wp_upload_dir();
    $intermediate_sizes = array();
    foreach ( get_intermediate_image_sizes() as $size ) {
        if ( $intermediate = image_get_intermediate_size( $attachment_id, $size ) )
            $intermediate_sizes[] = $intermediate;
    }
    // remove intermediate and backup images if there are any
    foreach ( $intermediate_sizes as $intermediate ) {
        /** This filter is documented in wp-admin/custom-header.php */
        $intermediate_file = apply_filters( 'wp_delete_file', $intermediate[ 'path' ] );
        @ unlink( path_join( $uploadpath[ 'basedir' ], $intermediate_file ) );
    }
}

サムネイルを再作成することは、添付ファイルのメタデータを生成および更新する場合にすぎません。そのため、注目の画像が変更されるたびに再生成することで、目的の効果が得られるはずです。

これはアップロード時に機能しますが、注目の画像が変更されたときにも機能します。それに加えて、それは古いサムネイルのために親指を再生成するので、それは再び通常のサイズの通常の画像のようです。

add_post_metadataおよびupdate_post_metadataフックを使用する理由は、現在の値beforeにアクセスできるようにするためです。これはデータベース内で更新されます。

_ note _ 特集画像のメディアポップアップの追加とエディタの間には実質的な違いはありません。これらのリンクは異なる状態でポップアップを開くだけなので、どの状態が要求されたかを知る簡単な方法はありません。 )画像がアップロードされているとき、それ故に私が上に示したアプローチ。

_ update _ 添付ファイル用に生成されたサムネイルのセットを削除するために呼び出すことができる関数を追加しました。新しい添付ファイルのメタデータを生成する前にこれを呼び出します。あなたはそれが引数としてそれらを渡すことができるようにそれが削除するか、または関数を修正する画像サイズをフィルターにかけることさえできます。

4
sanchothefat

あなたもこれを試すことができます

function post_type_sizes( $image_sizes ){

    $feature_image_sizes = array('thumbnail');

    // checking for feature image uploading or not
    if( isset($_REQUEST['post_id']) && 'post' === get_post_type($_REQUEST['post_id']) && get_post_meta( $_REQUEST['post_id'], 'feature_image_uploading', true ) ){
        update_post_meta( $_POST['post_id'],'feature_image_uploading', false );
        return $feature_image_sizes;
    }

    return $image_sizes;
}
add_filter('intermediate_image_sizes', 'post_type_sizes', 999 ); 

add_action('admin_footer', 'monksinc_notify_feature_image_event', 9999 );
function monksinc_notify_feature_image_event(){

    global $pagenow, $post;

    if( 'post.php' !== $pagenow && 'post' !== get_post_type( $post->ID ) )
        return;

    ?>
    <script>
        (function(){
            jQuery('#set-post-thumbnail').click(function(e){
                e.preventDefault();
                jQuery.post(
                    ajaxurl,
                    { action: 'set_post_thumbnail_notify', post_id: jQuery('#post_ID').val() },
                    function( response ){

                        console.log(response);
                    }
                );
            });
        })();
    </script>
    <?php
}

add_action( 'wp_ajax_set_post_thumbnail_notify', 'set_post_thumbnail_notify_callback' );
function set_post_thumbnail_notify_callback(){

    $result = array( 'status'=> 'fail'  );

    if( isset( $_POST ) && 'set_post_thumbnail_notify' === $_POST['action'] && '' !== $_POST['post_id'] ){
        update_post_meta( $_POST['post_id'],'feature_image_uploading', true );
        $result = array( 'status'=> 'success' );
    }

    echo json_encode($result);
    die();
}
  1. このスクリプトでは、私はユーザーが注目の画像をアップロードしていることを私に通知する機能画像リンクへのAjax呼び出しを追加しています
  2. ユーザーがおすすめの画像をアップロードするときに投稿メタを設定し、この投稿メタを使用して、特徴付き画像の特定のサイズを生成するための条件付きチェックを行います。
2
Ravinder Kumar