web-dev-qa-db-ja.com

ページテンプレートの場合は画像サイズを追加

私はWordPress Multisiteでメンバーズウェブサイトを構築しています。選択したテンプレートに応じて生成される画像の数を制限することは可能ですか?

ギャラリーテンプレートに特定の画像を生成するために、次のコード行を試しました。

// Generate on all uploads
add_theme_support('post-thumbnails');
set_post_thumbnail_size( 1440, 350, true ); 
add_image_size( 'standard_box', 450, 215, true );
add_image_size( 'default_image', 691, 9999 );

// Generate on gallery template only
if ( is_page_template('page-gallery.php') ) {
add_image_size( 'gallery', 900, 9999 );
add_image_size( 'gallery_thumb', 450, 450, true );
}

これはうまくいきませんでした。私はいくつかの研究をしましたが、この問題に関して何かを見つけることはできません。あなたが私を正しい方向に向けることができれば、私はそれを本当に感謝します。

11
Sam

これは私にとって常に悩みの種でした - オンデマンドの画像サイズの欠如、そしてあなたがたくさんのサイズを持っているならあなたが最終的に置くことができるファイルの数!

あなたの努力の背後にある論理を見ることができます - 問題はアップロードの時点で本当にadd_image_sizeのみが登場します。そのため、is_page_template(..)は常にfalseになります。

クイック グーグル 掘り出し物 Aqua Resizer 、この問題に取り組むために設計されたスクリプト。 add_image_sizeを使用するのではなく、aq_resizeをテーマに直接使用します。画像のサイズが存在しない場合は、オンザフライで作成およびキャッシュされます。

実際、私は多くの画像サイズを持ついくつかのサイトで、似ているが異なるとはいえ、同じテクニックを使用しました。アップロードされたevery imageに対してeveryサイズを生成するWordPressのオーバーヘッドを依然として節約できます。違うところは、通常どおりWPの標準画像機能とテンプレートタグをすべて使用できるということです。

また、@ Waqasが述べたように、メディアライブラリから画像を削除すると、Aqua Resizerを使用しても孤立ファイルが残ります。私の技術では、allファイルはデータベースに保存され、WordPressによって認識されるので削除されます。

/**
 * Resize internally-registered image sizes on-demand.
 *
 * @link    http://wordpress.stackexchange.com/q/139624/1685
 * 
 * @param   mixed   $null
 * @param   int     $id
 * @param   mixed   $size
 * @return  mixed
 */
function wpse_139624_image_downsize( $null, $id, $size ) {
    static $sizes = array(
        'post-thumbnail' => array(
            'height' => 350,
            'width'  => 1440,
            'crop'   => true,
        ),

        'standard_box' => array(
            'height' => 215,
            'width'  => 450,
            'crop'   => true,
        ),

        'default_image' => array(
            'height' => 9999,
            'width'  => 691,
            'crop'   => false,
        ),

        'gallery' => array(
            'height' => 900,
            'width'  => 9999,
            'crop'   => false,
        ),

        'gallery_thumb' => array(
            'height' => 450,
            'width'  => 450,
            'crop'   => true,
        ),
    );

    if ( ! is_string( $size ) || ! isset( $sizes[ $size ] ) )
        return $null;
    if ( ! is_array( $data = wp_get_attachment_metadata( $id ) ) )
        return $null;
    if ( ! empty( $data['sizes'][ $size ] ) )
        return $null;
    if ( $data['height'] <= $sizes[ $size ]['height'] && $data['width'] <= $sizes[ $size ]['width'] )
        return $null;
    if ( ! $file = get_attached_file( $id ) )
        return $null;

    $editor = wp_get_image_editor( $file );

    if ( ! is_wp_error( $editor ) ) {
        $data['sizes'] += $editor->multi_resize(
            array(
                $size => $sizes[ $size ],
            )
        );

        wp_update_attachment_metadata( $id, $data );
    }

    return $null;
}

add_filter( 'image_downsize', 'wpse_139624_image_downsize', 10, 3 );

そして実際には:

wp_get_attachment_image( $id, 'gallery' ); // Resized if not already
wp_get_attachment_image_src( $id, 'standard_box' ); // Resized if not already
the_post_thumbnail(); // You get the idea!
// And so forth!

私はこれをすべてのadd_image_size呼び出しを自動的にオンデマンドリサイズに変換するプラグインに変えるつもりですので、このスペースを見てください!

12
TheDeadMedic

その場で親指を作成したい場合は、 Aqua image resizer を使用できます。ライブラリから画像を削除しても、作成されたサムは削除されません。しかしそれは大したことではありません。必要ならば、 SHHコマンドを使って実行できます

3
wp student

それはあなたの問題に対する直接的な答えではありません。しかし私はあなたがあなたの必要性に従ってイメージを作るのを助けます。

Add_image_sizeを使用すると、既存の画像のサイズは変更されません。 add_image_size関数を追加した後にアップロードされる新しい画像に対してのみ機能します。

だからあなたのコードはis_page_template関数のための新しい画像を生成しないでしょう。

しかし、あなたはあなたの問題を解決するために簡単なphpクラスを使うことができます....それはWordPressのためにそこに多くのプレミアムテーマのために使われている有名なphpクラスです。それはAqua-Resizerと呼ばれています。

あなたはここでより多くの詳細を見つけることができます https://github.com/syamilmj/Aqua-Resizer Wiki: https://github.com/syamilmj/Aqua-Resizer/wiki

発生する可能性がある問題:

この機能はこのように働きます....

<?php aq_resize( $url, $width, $height, $crop, $single ) ?>

つまり、(高さや幅が定義されている小さな画像の場合)クロップできない場合は、何も表示されません。この関数内でURLを渡した後にnull値を取得しているかどうかを確認することで、この状況を克服できます。

<?php 
$thumb = wp_get_attachment_url( get_post_thumbnail_id($post->ID), 'full' ); if($thumb){ $url = aq_resize( $thumb, 400, 200, true, true ); if(!$url){ $url = WPM_DIR.'/assets/images/demo/wrong_image_size.jpg'; } }else{ $url = WPM_DIR.'/assets/images/demo/400x200_no_feature_image.jpg'; } 
?>

これにより、特定の画像が特定のページテンプレート用に生成されるようになり、Webサイトがよりきれいになります。

P.S:このphpクラスはWordPressのコアトリミングシステムを使用するため、セキュリティ上の問題はありません。

1
WpMania.Net