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


13

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

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

// 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 );
}

これはうまくいきませんでした。私はいくつかの研究を行ってきましたが、このテーマについては何も見つけられないようです。あなたが正しい方向に私を指すことができれば、私は本当に感謝しています。


1
また、OttoのDynamic Image Resizerを使用すると、必要な数の画像サイズを定義できますが、必要なときに特定のサイズの画像のみを生成できます。たとえば、ギャラリーのサムネイルは、page-gallery.phpテンプレートに表示される画像に対してのみ生成されます。
14年

2
@kaiser のDynamic Image ResizeとJetPackのPhotonサービスの2つの優れたオプションに言及したいだけです。
バージール

回答:


13

これは私にとって常にバグベアでした-オンデマンドの画像サイズ変更の欠如、そしてあなたがたくさんのサイズを持っているなら、あなたが最終的にファイルの数を増やすことができます!

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

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

実際、多くの画像サイズを持ついくつかのサイトで、異なるとはいえ、同様の手法を使用しました。アップロードされたすべての画像のすべてのサイズを生成するWordPressのオーバーヘッドを節約できます。要求されたとおりにオンザフライで生成(およびキャッシュ)されます。異なる点は、WPの標準の画像関数とテンプレートタグをすべて通常どおり使用できることです!

また、@ Waqasが述べたように、Aqua Resizerを使用すると、メディアライブラリから画像を削除するときに孤立ファイルが残ります。私の手法では、すべてのファイルはデータベースに保存され、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呼び出しをオンデマンドのサイズ変更に自動的に変換するプラグインに変えるつもりですので、このスペースを見てください!


このような素晴らしい回答を残すために時間を割いていただきありがとうございます。私は確かにこれを試してみます。サーバーを複数のユーザーに公開する前にこれを取得することが重要です。さらに質問がある場合は、お知らせします。
サム14年

2
the_post_thumbnail()でこれを試してみました。そしてそれは完全に動作します。1つの問題:画像を削除すると、スクリプトによってサイズ変更された画像が残ります。何か案は?
サム14

5


免責事項:
-これ実際には答えではありません
- されて話題にあなたの追加の研究のお手伝いをするためのもの。
-さらに、それ -少なくとも感じた-最近、同様の問題に関する同様の質問のより頻繁な発生を反映しています。


Wordpress開発に関するこのトピックに関する追加情報:

注:リストは、決して順序付けられたものではなく、包括的なものではありません。


3

その場でサムを作成したい場合は、Aqua image resizerを使用できますが、このミニスクリプトには欠点があります。ライブラリから画像を削除しても、作成されたサムは削除されません。しかし、大したことではありません。必要に応じて、SHHコマンドを使用して実行できます


1
ファイルが削除されないことの良い点。私のソリューションはこれに苦しむことはありません!(更新された回答を参照)。
TheDeadMedic 14年

1

それはあなたの問題に対する直接的な答えではありません。しかし、私はあなたがあなたの必要に応じてイメージを作るのを手伝います。

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

したがって、コードはis_page_template関数の新しい画像を生成しません。

しかし、あなたはあなたの問題を解決するために単純な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サイトがよりきれいになります。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.