サーバーにアップされた画像を一覧表示&自動更新
-
初めて利用させていただきます。宜しくお願い致します。
サーバー内にあるフォルダにアップされた画像(メディア内フォルダでも可)を一覧表示出来るプラグインを探しています。
ご存知の方がおられましたら、ご教授頂ければ幸いです。3日ほど未検証となった古いものも含め色々なプラグインを探し試しましたが、思うような結果が得られませんでした。
現在利用中の下記のようなものがあればとても嬉しいのですが「画像の一覧表示とページ送りのみ」等 これなら出来るという情報もお待ちしています。1 商品ギャラリー(固定ページ)にて
・画像名(ファイル名を元に判別・付与する)
・画像サムネイル(クリックで拡大画像表示)
を1組として一覧表示し、一定数毎にページ化して< 左右 >クリック及び下段のページ番号にて移行。2 画像アップロード時に自動更新。
プラグイン以外でも上記の仕様が実現可能な方法があれば、お知らせ頂ければと思います。
何卒宜しくお願い致します。《 経緯説明 》
WordPressを古いバージョンのまま使い続けてきましたが、当該PHPがサポートされなくなったためサイトを新規に構築し直すことになりました。
※現在のサイトでは、PHPテンプレートを読み込む形のページが多くそのまま移植することは出来ません。
現在のサイトを構築頂いた方との関係が切れているため、可能な限りプラグインや汎用テーマを使って更新やメンテナンスが担当レベルで可能なもので構築したいと考えています。長文となりましたが、最後までお読み頂きありがとうございました。
-
funi365さん、こんにちは。
経緯は分かりましたが、サーバー内の画像を直接拾って一覧表示したい理由は何でしょう?
WordPress で管理されている画像(メディアからアップロードされた画像)であれば、 WordPress の関数を活用して一覧表示することもできそうな気がしますが、サーバー内の画像をリストアップするには、 PHP をそのまま利用して指定されたディレクトリを直接クロールする必要があり、組み方によってはページを表示するたびにファイルをクロールするような構造になりかねません。
これを回避するには一定時間等でクロールし、 DB 等に結果を保存する、キャッシュするなどの工夫が必要になりそうです(画像数がそれほど多くなければ負荷はないかもしれませんが…)。まずは要件をしっかり検討してみて、提示頂ければ、みなさんから最適な解決案も頂けるかもしれません。
ご参考になれば。shokun0803 さま
早々にコメント頂きありがとうございます。
仕様を踏襲したい理由は、画像編集担当者がWordPressを直接触ることなくFTPで画像をアップするだけで更新可能なため(引き続き)対応可能だという単純な理由です。
プラグインやカスタマイズ(依頼を含む)で同様の仕様が実現出来るようであれば、担当変更せずに継続したいと考えています。
他にもご不明な点等ございましたら、何なりとご質問下さい。
funi365さん、こんにちは。
WordPress の管理画面からの画像アップロードより FTP を利用した方が簡易であるという理由がいまいち分かりませんが… FTP 操作をエンジニア以外が実施すると間違って WordPress のコアファイルを触ってしまいそうな気もします…
まあ、そこは置いておいて、いろいろと要件が厳しくなると思いますね。まずプラグインでは難しいかと。
1.「2 画像アップロード時に自動更新。」
WordPress を介さずに FTP で画像をアップロードするという事は、 WordPress 側でいつ画像がアップロードされたか認識できません。定期的にクロールする等の仕組みが必要になります。
2.「一定数毎にページ化して< 左右 >クリック及び下段のページ番号にて移行。」
アップロードされている画像数を把握する必要があり、常にクロールするか、 DB 等にクロールされた情報を保存し、該当のディレクトリから一定の並べ替え条件のもと先頭から〇枚といったように画像データを取得し、 img タグに画像 URL を順番に配置したコードをページテンプレート(もしくはショートコード)等で作り出す必要があります。どちらの要件もサーバー上に存在している画像数と、クロールするタイミング( 1 時間おきとか 15 分おきとか)の設定次第でサーバーに負荷がかかります。
これら要件をクリアでき、かつサーバーの負荷も気にならない(サーバー会社が問題にしない)のであれば、 PHP で構築することは可能であると思われます。可能かどうかで言えば、おそらく可能ですが、既存のプラグインでは難しいと思いますので、自身でプラグインを作成するか、業者への依頼となるかと思われます。
例えばショートコードを作成した場合のコード例です。
function image_lists() { $outfile = 3; $paged = get_query_var( 'paged' ); //$pagepath = $current_pgae == 0 ? '' : '/page/' . $current_pgae; $imgs = glob( 'wp-content/uploads/*/*/{*.jpg,*.png}', GLOB_BRACE ); foreach( $imgs as $img ) { $tag[] = "<img src=\"/{$img}\" width=\"150\">"; } $page = ceil( count( $tag ) / $outfile ); if( $paged > 1 ) { $tag = array_slice( $tag, ( $paged - 1 ) * $outfile, $outfile ); } else { $tag = array_slice( $tag, 0, $outfile ); } global $wp_rewrite; $paginate_base = get_pagenum_link(1); if(strpos($paginate_base, '?') || !$wp_rewrite->using_permalinks()){ $paginate_format = ''; $paginate_base = add_query_arg('paged','%#%'); }else{ $paginate_format = (substr($paginate_base,-1,1) == '/' ? '' : '/') . user_trailingslashit('page/%#%/','paged'); $paginate_base .= '%_%'; } $tag[] = paginate_links(array( 'base' => $paginate_base, 'format' => $paginate_format, 'total' => $page, 'mid_size' => 1, 'current' => ( $paged ? $paged : 1 ), 'prev_text' => '< 前へ', 'next_text' => '次へ >', )); $ret = implode( "\n", $tag ); return $ret; } add_shortcode( 'image_lists', 'image_lists' );
先ほど説明したサーバーへの負荷等は一切考えていない構成ですので、参考例としてご確認ください。
ご参考になれば。
shokun0803 さま
二度にわたり丁寧にご説明頂いた上に、参考コードまでご記載頂きありがとうございます。
作業的には、週に何度か400枚程度の画像更新(各画像 例 001.jpg を最新分に上書きする)を行っており、担当者にとっては不慣れなWordPressでの作業が負担になるため、FTPでアップフォルダのみの権限を持たせたアカウントから画像のアップのみを行って頂く形をとっております。
ただ、ご指摘頂いたようにプラグインでは実現が難しく、カスタマイズをご依頼させて頂いてもサーバーの負荷やアップデートの心配も出てくるかと思い、現在根本的な見直し(表示方法)を検討しております。
枚数の増減は多少ありますが、ほぼ画像データの更新(上書き保存分の読み込み)だけですので
ページネーション付きのギャラリーを一度作っておけば、更新時に新しい画像に置き換わるのではないか等、浅慮ながら知恵を絞って代替方法を模索したいと思っております。
またお知恵をお借りしなければいけないこともあるかと思いますが、もうしばらくお付き合い頂ければ幸いです。
※無事解決出来た時には、ご報告と解決済み申告を行わせて頂きます。宜しくお願い致します。
お世話になっております。
週末に下記のようなことを色々試してみたのですが、メディアライブラリではファイルの上書きが出来ないため思ったような結果は得られませんでした。◆メディアライブラリとギャラリープラグインで
1)メディアライブラリにフォルダ機能を追加
2)メディアライブラリ>photoフォルダに400枚(001.jpg ~ 400.jpg)の写真をアップロード
3)ギャラリープラグイン(photo Gallery by 10Web)でギャラリーを作成し、ページ内に呼び出し → 成功
4)同フォルダに001.jpg ~ 010.jpg の更新用画像をメディアライブラリからアップロード → アップロードされず → 失敗◆PHPやWPプラグインで
・PHP工房さんのPHP写真ギャラリーCMS : 同名ファイルも別ファイルとして表示
・WP プラグイン yatterukun : 400枚をアプリで順次アップする必要あり
・WP プラグイン Enable Media Replace : 各画像をそれぞれ置換する必要あり◆力技で(試行錯誤中)
・メディアライブラリのphotoフォルダの画像をimgタグで呼び出し : 表示される度に 400枚のサムネイルと拡大画像を順次 読み込み処理 → 非効率手詰まり状態のまま公開予定まで2週間弱。
お知恵をお貸し頂ければ幸いです。何卒宜しくお願い致します。funi365さん、こんにちは。
◆力技で(試行錯誤中)
・メディアライブラリのphotoフォルダの画像をimgタグで呼び出し : 表示される度に 400枚のサムネイルと拡大画像を順次 読み込み処理 → 非効率先日提示したコードの例では、一応 1 ページに表示される枚数を
$outfile = 3
(この場合 1 ページに 3 枚の画像)として設定し、glob( 'wp-content/uploads/*/*/{*.jpg,*.png}', GLOB_BRACE )
で指定ディレクトリ(この場合、 uploads ディレクトリ以下に年月ディレクトリがあるとして処理)をすべてクロールしてから、表示すべき枚数の画像以外を配列から削除array_slice( $tag, 0, $outfile )
するようにして表示タグを生成しております。上記少し考え方を改めて、
glob
で取得した段階で配列から表示ページに関係のないデータをarray_slice
してしまってからforeach
するように工夫すれば、ループする部分の動作を最低限に抑えられるかと思います。また、 WordPress の基本の機能であるget_transient
やset_transient
を駆使して表示ページ数ごとに部分キャッシュを設けてglob
自体を表示のたびに動作させないようにすれば、サーバーへの負荷もそれなりに低減できそうな気もします。transient
自体をクリアする方法はいくつかあるので、画像を FTP したらtransient
をクリアするようにすればキャッシュ時間を長くしていてもそれほど影響はないのではないかと考えます。ご参考になれば。
shokun0803さま
こんばんは。
度々ご返信頂き、心より感謝いたします。
お恥ずかしい限りなのですが、実は頂いたコードをfunction.phpに貼り付け
$outfile = 40;
$imgs = glob( ‘wp-content/uploads/photos/{*.jpg,*.png}’, GLOB_BRACE );
と改変しようとしたのですが、「syntax error, unexpected ‘ ‘ (T_STRING)」で挫折してしまいました。プログラミングはCGIやPHPの軽微な変更が出来る程度の知識しかなく、自身で実装しようと思えるほど自信がありません。
可能であればご依頼を含め直接ご相談させて頂ければと思うのですが、いかがでしょうか。
サポートフォーラムでこのような事をお伺いして良いものか判断出来ず、連絡方法も分からないためこちらに返信させて頂きましたが、ルールやマナーに反するようであればお知らせ下さい。色々とお世話をお掛けして申し訳ございませんが、ご検討のほど宜しくお願い致します。
funi365さん、こんにちは。
サポートフォーラムでこのような事をお伺いして良いものか判断出来ず、連絡方法も分からないためこちらに返信させて頂きましたが、ルールやマナーに反するようであればお知らせ下さい。
そうですね、こちらのフォーラムでは直接の依頼をすることや依頼受けますよと言うことは禁止されております。あくまでもコミュニティのサポートと認識されてください。
実際に改変して実装されようとされたことは素晴らしいと思います。本当はまず基礎を学習されてからが良いとは思いますが、試行錯誤でも自らの手を動かすことで学べることは多いと思っております。
一応時間があるときにサンプルコードの見直しもしてみますが、可能な限り自身でも調べてみてください。まずはエラー表示がなぜ出ているかを調べて実践されてみることをお勧めいたします。おそらくですが今回のエラーはクウォーテーションの閉じ場所、数がどこか間違っている単純なミスかと思われます。文末のセミコロンを間違って消していないかなども確認されてみましょう。
ご参考になれば。
funi365さん、こんにちは。
ちょっとだけサンプルコードを改修してみました。
function image_lists() { global $post, $wp_rewrite; $outfile = 40; $expiration = 60 * 60 * 24; $pattern = 'wp-content/uploads/*/*/{*.jpg,*.png}'; $paged = get_query_var( 'paged' ); $transient = 'gallery_' . $post->ID . '_' . $paged; if( false === ( $ret = get_transient( $transient ) ) ) { $imgs = glob( $pattern, GLOB_BRACE ); $totalpage = ceil( count( $imgs ) / $outfile ); $imgs = ( $paged == 0 )? array_slice( $imgs, 0, $outfile ): array_slice( $imgs, ( $paged - 1 ) * $outfile, $outfile ); foreach( $imgs as $img ) { $tag[] = "<img src=\"/{$img}\" width=\"150\">"; } $paginate_base = get_pagenum_link(1); if(strpos($paginate_base, '?') || !$wp_rewrite->using_permalinks()){ $paginate_format = ''; $paginate_base = add_query_arg('paged','%#%'); }else{ $paginate_format = (substr($paginate_base,-1,1) == '/' ? '' : '/') . user_trailingslashit('page/%#%/','paged'); $paginate_base .= '%_%'; } $tag[] = paginate_links(array( 'base' => $paginate_base, 'format' => $paginate_format, 'total' => $totalpage, 'mid_size' => 1, 'current' => ( $paged ? $paged : 1 ), 'prev_text' => '<', 'next_text' => '>', )); $ret = implode( "\n", $tag ); set_transient( $transient, $ret, $expiration ); } return $ret; } add_shortcode( 'image_lists', 'image_lists' );
一応、 transient も設定しできるだけ負荷が発生しないように工夫はしています。
キーポイントとしては、 PHP のglob
の使い方です。画像を正確に取得するにはサーバールートからのアドレスを指定すると良いのですが、サーバールートのままだとimg
タグ生成時に面倒です。そこでドメインルートからの指定としているのですが、このままだと相対アドレスになってしまいます。 WordPress の場合相対アドレスで指定してしまうとページが変わった場合等に階層も変わってしまうため、img
タグ生成時には絶対アドレスで指定するのがよろしいかと思われます。このサンプルコードの場合、画像のサイズを固定で指定してしまっていますが、同時に画像のサーバールートからの絶対アドレスが取得できれば自動で画像サイズを取得して指定することも可能かと思います。おそらく死ぬほどめんどくさいですw
あとはタグの作り方次第ですかね。このコードの場合
$tag[] = "<img src=\"/{$img}\" width=\"150\">";
と、img
タグしか作っていないので、div
で囲むとかリストにしてしまうとか、サイトのデザインに合わせてタグを追加するとよろしいかと。transient の指定ですが、サンプルの場合は 1 日( 60 * 60 * 24 )としています。あまりキャッシュがすぐに切れてしまうと、ページの再生成を短時間で繰り返してしまうのでよろしくないかと思います。
キャッシュをクリアする方法ですが、例えば以下のプラグインがあります。
https://minkapi.style/web/post-190/
Clear Transient From Dashboard
ちょっと長いこと更新されていないプラグインですが、ローカルの最新版では動作したのを確認しています。画像アップロード時に管理画面からクリアすればすぐに表示が変更されると思います。
他のプラグインを探してみてもよろしいかと。ご参考になれば。
shokun0803さま
お世話になっております。
ご依頼の件、ご教授頂きありがとうございます。
反省し、以降留意したいと思います。syntax error, unexpected ‘ ‘ (T_STRING) についてですが
$outfile = 40; に対しての警告でしたので
御提示頂いた内容のままをコピペし直し更新を行ってみましたが、やはり同様のところで警告が出るようです。
半角スペースでトラブルになるケースも経験があったので以下のものを試しましたが結果は変わりませんでした。
$outfile = 3;
$outfile=3;
$outfile = ‘3’;
$outfile=’3′;次に【WordPress】「syntax error, unexpected ‘ ‘ (T_STRING)」が発生!解消法は? といったサイトで該当コードを一度削除し、FTPでfunction.phpをダウンロード>コードを貼り付け>保存>アップしてみたところ「サイトで技術的な問題が発生しています」と出てサイトが表示されなくなりました。
元のfunction.phpをアップし直し、表示されるようになりましたが該当コードを貼り付けるとやはり同様の結果になりました。その後も色々と試し、やっとfunction.phpでエラーが出なくなりました!!
結果的に「テーマを編集」で直接編集をするとエラーになり、事前にテキストエディタ(UTF-8 BOMなし)で編集したものをコピペすると保存できました。固定ページにショートコードを記入して保存、ページを表示 画像が表示されずpaginationのみ表示。
foreach( $imgs as $img ) { $tag[] = "<img src=\"/{$img}\" width=\"150\">"; }
imgタグのsrcにサイトURL(下記はダミー)を追加で表示されるようになりました!!
$tag[] = ““;このコードを元にファイル名の追加やサムネイル表示 → クリックで拡大画像表示なども追加さし活用させて頂ければと思います。
またわからないことが出来ましたら追記させて頂ければと思います。
宜しくお願い致します。タグをコードで囲み忘れました。(–;)
$tag[] = "<img src=\"https://xxxwp.com/{$img}\" width=\"150\">";
連投失礼いたしました。
shokun0803さま
お世話になっております。
改修コードを元に再度挑戦し、おかげさまで無事「一覧表示」「クリックで拡大表示」「pagination付き」のギャラリーを表示することが出来ました。
cashclear のプラグインを追加したことで、上書き更新も成功いたしました!一覧表示が成功すると、色々と欲が出て「商品名を追加したい」「固定枚数ではなく各ページ毎に枚数を変更したい」など夢?は広がるばかりですが、当初の目標を達成できたのでこれにて解決済みとさせて頂きます。
度々ご助力頂きありがとうございました。
また機会がありましたら、宜しくお願い致します。(*- -)(*_ _)ペコリ
寒さが厳しくなってまいりましたので、お体ご自愛くださいませ。funi365さん、こんにちは。
試行錯誤からのご自身で完成形に持っていけたこと、とても素晴らしいと思います。
せっかくなのでちょっと工夫してプラグイン化してみました。
https://github.com/shokun0803/glob_gallery_plugin気が向いた時に覗いてみてください。
そのうち簡単なコード紹介も Qiita にでも書いておこうと思います。
ちょっと用途が限定的ですけどね…ご参考になれば。
- トピック「サーバーにアップされた画像を一覧表示&自動更新」には新たに返信することはできません。