記事ランキングにサムネイル表示
永らくありがとうございました › フォーラム › 使い方全般 › 記事ランキングにサムネイル表示
- このトピックには16件の返信、2人の参加者があり、最後に
匿名により10年前に更新されました。
-
投稿者投稿
-
2011 年 1 月 24 日 3:52 PM #2666
匿名
ゲストtoemon様
ご無沙汰しております。
昨年はいろいろとお世話になりました。
今年は、多少なりともPHPが理解できるよう
精進してまいりたいと思います。
どうか温かい目でご指導のほどよろしくお願いします。
さて、表題に書かせていただきました件ですが、
以前、「人気記事ランキングの表示」と「サムネイル付記事一覧表示」について
ご指導いただきました。
人気記事ランキングはCounterize IIプラグインを、
サムネイル付記事一覧はQF-GetThumbプラグインを使って
それぞれ拡張ブロックで表示しております。
これらを合体させて、「サムネイル付の記事ランキング」が表示できないものかと悪戦苦闘しております。
ただいまランキング一覧につきましては、
記事ランキング画像+タイトルリンクを並べておりまして、
下記のようなコードになっています。
<code><?php<br /> if (function_exists('counterize_getuniquehitstoday')){<br /> $number = 50;<br /> $wpdb =& $GLOBALS['wpdb'];<br /> $sql = "SELECT p.count as amount, p.url as url, p.url as label, p.postID as post_id , COUNT(m.id) as day_count"<br /> . " FROM " .counterize_logTable(). " m, " . counterize_pageTable(). " p "<br /> . " WHERE m.pageID = p.pageID and p.postID IS NOT NULL and "<br /> . " m.timestamp >= '$onedayago'"<br /> . " GROUP BY p.url "<br /> . " ORDER BY day_count DESC LIMIT $number";<br /> $rows = $wpdb->get_results($sql);<br /> $ranking = 1;<br /> foreach($rows as $row){<br /> $postid = $row->post_id;<br /> $post_data = get_post($postid);<br /> $title = $post_data->post_title;<br /> $ranking_text = $ranking . '位';<br /> $image_url = 'http://example.com/uploads/ranking/ranking_' . $ranking . '.gif';<br /> if (@fclose(@fopen($image_url, "r"))){<br /> echo '<img src="' . $image_url . '" alt="' . $ranking_text . '"/>';<br /> }else{<br /> echo $ranking_text . '' ;<br /> }<br /> echo '<a href="' . $row->url . '">'. $title . '</a><hr style="clear:both;margin-top:3px;">';<br /> $ranking++;<br /> }<br /> }<br /> ?></code>
最近、ランキングの取得時間がなんかおかしい?と思い、
WP関連のサイトを参考にいじってみましたが
もしかすると間違っているかもしれません。
でも何とか動いているようです(笑)
次にサムネイル付記事一覧表示は以下のような
コードになっております。
<code><?php<br /> global $wpdb;<br /> $show_posts =50;<br /> if (!is_null($wpdb)){<br /> $wp_query->in_the_loop = true;<br /> $r = new WP_Query("cat=$cat_id&showposts=$show_posts&what_to_show=posts&nopaging=0&post_status=publish");<br /> while($r->have_posts()){<br /> $r->the_post();<br /> if(function_exists('the_qf_get_thumb_one')){<br /> echo the_qf_get_thumb_one("num=0&width=60");<br /> }<br /> }<br /> }<br /> ?></code>
これをあれこれ合体させてみてはいるのですが、
ランキングに合ったサムネイルを引っ張ってくることができずにいます。
これらプラグインを利用して
サムネイル付のランキング一覧を表示させることは可能でしょうか。
もし他の手段があるようであれば
ご教授願いたく、よろしくお願い申し上げます。
2011 年 1 月 26 日 3:30 PM #3213toemon
キーマスターky982339さん、お久しぶりです。
検証していませんが、
the_qf_get_thumb_one()の仕様によりますと、
the_qf_get_thumb_one($gt_settings = “”, $default_image = “”, $source = Null)
// 記事ソース内の指定された画像を1つ抽出する関数
// $gt_settings
// num=0 : 何番目の画像を取り出すかの指定
// width=0 : 画像の幅指定
// height=0 : 画像の高さ指定
// tag=1 : イメージタグを返すか / 返さないか(返さない場合、画像のURLを返す)
// global=0 : 同一サーバ内のデータに限定するかどうか
// crop_w=0 : クロップ時の横幅
// crop_h=0 : クロップ時の縦幅
// find=string : 検索文字列(全文検索一致データの画像指定)
// $default_image : 画像が無い場合は、ここに指定された値を返す(無ければfalse を返す)
// $source : ソース取得先の指定(無ければ the_content を参照する)
とありますので
先のコードのforeachループ中に、第3引数に$post_data->post_contentを指定した
<code>if(function_exists('the_qf_get_thumb_one')){<br /> echo the_qf_get_thumb_one("num=0&width=60","",$post_data->post_content);<br /> }</code>
を追加して
<code><?php<br /> if (function_exists('counterize_getuniquehitstoday')){<br /> $number = 50;<br /> $wpdb =& $GLOBALS['wpdb'];<br /> $sql = "SELECT p.count as amount, p.url as url, p.url as label, p.postID as post_id , COUNT(m.id) as day_count"<br /> . " FROM " .counterize_logTable(). " m, " . counterize_pageTable(). " p "<br /> . " WHERE m.pageID = p.pageID and p.postID IS NOT NULL and "<br /> . " m.timestamp >= '$onedayago'"<br /> . " GROUP BY p.url "<br /> . " ORDER BY day_count DESC LIMIT $number";<br /> $rows = $wpdb->get_results($sql);<br /> $ranking = 1;<br /> foreach($rows as $row){<br /> $postid = $row->post_id;<br /> $post_data = get_post($postid);<br /> $title = $post_data->post_title;<br /> $ranking_text = $ranking . '位';<br /> $image_url = 'http://example.com/uploads/ranking/ranking_' . $ranking . '.gif';<br /> if (@fclose(@fopen($image_url, "r"))){<br /> echo '<img src="' . $image_url . '" alt="' . $ranking_text . '"/>';<br /> }else{<br /> echo $ranking_text . '' ;<br /> }<br /> <br /> if(function_exists('the_qf_get_thumb_one')){<br /> echo the_qf_get_thumb_one("num=0&width=60","",$post_data->post_content);<br /> }<br /> <br /> echo '<a href="' . $row->url . '">'. $title . '</a><hr style="clear:both;margin-top:3px;">';<br /> $ranking++;<br /> }<br /> }<br /> ?></code>
みたいな感じで取得できるのではなかろうかと思います。
2011 年 1 月 27 日 10:02 AM #3214匿名
ゲストtoemon様
ありがとうございます。
最初、ランキングが1段ずつずれてしまったので、
以下のようなコードに変更しましたところ無事に表示させることができました。
<code><?php<br /> if (function_exists('counterize_getuniquehitstoday')){<br /> $number = 50;<br /> $wpdb =& $GLOBALS['wpdb'];<br /> $sql = "SELECT p.count as amount, p.url as url, p.url as label, p.postID as post_id , COUNT(m.id) as day_count"<br /> . " FROM " .counterize_logTable(). " m, " . counterize_pageTable(). " p "<br /> . " WHERE m.pageID = p.pageID and p.postID IS NOT NULL and "<br /> . " m.timestamp >= '$onedayago'"<br /> . " GROUP BY p.url "<br /> . " ORDER BY day_count DESC LIMIT $number";<br /> $rows = $wpdb->get_results($sql);<br /> $ranking = 1;<br /> foreach($rows as $row){<br /> $postid = $row->post_id;<br /> $post_data = get_post($postid);<br /> $title = $post_data->post_title;<br /> $ranking_text = $ranking . '位';<br /> $image_url = 'http://example.com/uploads/ranking/ranking_' . $ranking . '.gif';<br /> if (@fclose(@fopen($image_url, "r"))){<br /> echo '<img src="' . $image_url . '" alt="' . $ranking_text . '"/>';<br /> }else{<br /> echo $ranking_text . '' ;<br /> }<br /> if(function_exists('the_qf_get_thumb_one')){<br /> <br /> echo '<a href="'. $row->url . '">' . the_qf_get_thumb_one("num=0&width=120&tag=1","",$post_data->post_content) . '</a>';<br /> }<br /> echo '<a href="' . $row->url . '">'. $title . '</a><hr style="clear:both;margin-top:3px;">';<br /> $ranking++;<br /> }<br /> }<br /> ?></code>
また、サムネイル自体にも記事リンクを取得するために
以下のように指定してみました。(これには苦戦しました…orz)
<code>echo '<a href="'. $row->url . '">' . the_qf_get_thumb_one("num=0&width=120&tag=1","",$post_data->post_content) . '</a>';</code>
ちなみに、Counterize IIプラグインで50位までランキング表示していて
同じ記事がランキングされていることに気がつきました。
URLの/modules/を消すために.htaccessで以下のコードを入れているのですが、
おそらく検索ロボットなのか、/modules/を含んだページもアクセスログを
取ってしまっているようです。
.htaccessのコード
<code>RewriteRule xpress$ xpress/ [L]<br /> RewriteRule ^xpress/(.*)$ modules/xpress/$1 [L]</code>
そのため、
1位に来ているページが
40位あたりにもランクインしているという状況です。
1位→http://example/xpress/?p=880
40位→http://example/modules/xpress/?p=880
modulesを含むリンクを引っ張らない、
もしくは記録しないようにする対応策はございますでしょうか。
2011 年 1 月 27 日 3:21 PM #3215匿名
ゲストたびたび恐れ入ります。
QF-GetThumbのみでサムネイル付の記事一覧を表示する際は、
たとえば$cat_id = 10;のようにしてカテゴリを絞った抽出ができましたが、
今回のようにランキングと結合した場合、カテゴリを指定することは可能でしょうか。
ところどころに$cat_id = 10;を入れて試してみましたが、
どうもカテゴリ指定ができません。
度重なる質問で申し訳ございません。
2011 年 1 月 28 日 4:50 AM #3216toemon
キーマスターmodulesを含むリンクを引っ張らない、
もしくは記録しないようにする対応策はございますでしょうか。
記録はCounterize IIプラグイン側での処理ですので、これを止める方法は分かりませんが、
「modulesを含むリンクを引っ張らない」という処理であれば、正規表現等でURLをチェックし、処理をパスするのが良いと思います。
たとえば$cat_id = 10;のようにしてカテゴリを絞った抽出ができましたが、
今回のようにランキングと結合した場合、カテゴリを指定することは可能でしょうか。
wordpressのテンプレートタグin categoryを使って投稿が指定したカテゴリに属しているが調べることが出来ますのでこれを利用して処理を行えばよいかと思います。
「例」
カテゴリID 6に属していない場合、foreachループ内の以降の処理ををスキップする。
URLに「/modules/」という文字が含まれている場合、foreachループ内の以降の処理ををスキップする。
<code>foreach($rows as $row){<br /> if (! in_category(6,$row->post_id)) continue;<br /> if (preg_match('//modules//',$row->url)) continue;<br /> .<br /> .<br /> $ranking++;<br /> }</code>
みたいな感じです。
2011 年 1 月 28 日 5:28 AM #3217toemon
キーマスター追伸
http://example/modules/xpress/?p=880へのアクセスを切り捨てるのは忍びないという場合、
Counterize IIプラグイン
counterize.phpの608行目(Ver2.14.1の場合)
<code>$this_url = "http://".$_SERVER['HTTP_HOST'].$requesturl;</code>
の下に
<code>if ($this_url==$referer ){<br /> $referer = preg_replace('/modules//','',$referer);<br /> }<br /> $requesturl = preg_replace('/modules//','',$requesturl);<br /> $this_url = preg_replace('/modules//','',$this_url);</code>
を加えればCounterize IIプラグイン側で
http://example/modules/xpress/?p=880を
http://example/xpress/?p=880へのアクセスとして処理させることが出来ます。
2011 年 1 月 29 日 1:41 PM #3218匿名
ゲストありがとうございます。
「例」
カテゴリID 6に属していない場合、foreachループ内の以降の処理ををスキップする。
URLに「/modules/」という文字が含まれている場合、foreachループ内の以降の処理ををスキップする。
なるほど。。。
「●●だけを抽出する」というイメージでしたが、
含まれている場合・・・という処理なのですね。
“modules”を含む記事は無視することができしたが、
“cpage”を含むURLも存在しているようで、
下記のように記述してみたところ、
こちらも回避することができました!
<code>if (preg_match('//modules//',$row->url)) continue;<br /> if (preg_match("/cpage/",$row->url)) continue;</code>
トピックスの表題とは違いますが、
ランダムでサムネイル付の記事を一つだけ引っ張るにはどうすればいいか
いろいろ挑戦しているのですが・・・ん~ダメです。
こんな感じかなと思っているのですが・・・orz
<code><?php<br /> global $wpdb;<br /> $posts = get_posts('orderby=rand&numberposts=1');<br /> if(function_exists('the_qf_get_thumb_one')){<br /> echo '<a href="'. get_permalink() . '">' . the_qf_get_thumb_one("num=0&width=60","",$post_data->post_content) . '</a>';<br /> }<br /> echo '<div id="new_manga"><a href="'. get_permalink() . '">' . the_title('','',false) . '</a></div><hr style="clear:both;margin-top:3px; margin:10px 0px 10px 0px;"">';}<br /> }<br /> ?></code>
いかがでしょうか。
2011 年 1 月 30 日 2:30 PM #3219toemon
キーマスター「●●だけを抽出する」というイメージでしたが、
含まれている場合・・・という処理なのですね。
この処理には欠点があって、SQL側で20件の抽出を指定しても、foreachないでcontinueした数だけ表示する数が減ってしまうということです。
ランダムでサムネイル付の記事を一つだけ引っ張るにはどうすればいいか
いろいろ挑戦しているのですが・・・ん~ダメです。
wp-kougabuプラグインとかはだめですかね?
wp-kougabuプラグインを使ったKougaburariプラグインなんてのもあります。
2011 年 1 月 30 日 4:30 PM #3220匿名
ゲストこの処理には欠点があって、SQL側で20件の抽出を指定しても、foreachないでcontinueした数だけ表示する数が減ってしまうということです。
確かに、50件の指定をしましたが、49件しか表示されておらず、
51件にしたら50件表示されました。
continueした数がその時点で5件あれば5件指定した数よりも
減ってしまうわけですね。
なるほど。よくわかりました。
wp-kougabuプラグインとかはだめですかね?
wp-kougabuプラグインを使ったKougaburariプラグインなんてのもあります。
改めて上記プラグインを入れる必要があるんですね。
試しにwp-kougabuプラグインをインストールしてみました。
今までの拡張ブロックでの記述を参考に以下のようなコードで
試してみましたがエラーが。。。甘くありませんでしたorz
<code><?php<br /> global $wpdb;<br /> if(function_exists('kougabu_get_image')){<br /> echo kougabu_get_images();<br /> }<br /> ?></code>
どうしても、拡張ブロックでxoops側に引っ張ってくる際の
ルールというか、まだ意味がわかっていません。
global $wpdb;
はワードプレスのデータベースを参照せよという意味ですよね?
if(function_exists(‘kougabu_get_image’)){
は指定した関数が定義されている場合にTRUEを返す。
という説明を読みました。
この場合では、kougabuプラグインが設定されていれば・・・
という感じなのかなと。
テーマ内にランダムに抽出した1枚の画像を出力する関数指定例として
<code><?php kougabu_get_images(); ?></code>
とありましたので、echoで吐き出すことができるのかなと思いましたが。
2011 年 1 月 31 日 3:07 AM #3221toemon
キーマスター拡張ブロックでxoops側に引っ張ってくる際の
ルールというか、まだ意味がわかっていません。
拡張ブロックは、プラグイン側からでも、直書きでもとにかくechoしたものをそのまま表示するという仕組みになっています。
唯一、出力が何もない場合、PHP_Errorの表示が行われるというルール(バグ?)があります。
if(function_exists(‘kougabu_get_image’)){
は指定した関数が定義されている場合にTRUEを返す。
という説明を読みました。
この場合では、kougabuプラグインが設定されていれば・・・
という感じなのかなと。
そのとおりで、利用したい関数が、利用できる状態になっているか確認するためで、例えば、プラグインがインストールされていなかったり、有効になっていなかったりする場合に、PHPに、そんな関数なんて存在しないよ!!って拗ねられたりしないための、おまじないみたいなものです。
で、本題ですが
kougabu_get_images();自体がデフォルトでechoする関数なので
普通に拡張ブロック側で
<code><?php<br /> if (function_exists('kougabu_get_images')){<br /> kougabu_get_images("start=1&count=1&before=&after=");<br /> }<br /> ?></code>
とかやれば、1件の画像をランダム表示してくれるはずです。
タイトルとかも表示したいのなら。パラメータにarray=trueを付加してechoではなく配列で出力させ
<code><?php<br /> if (function_exists('kougabu_get_images')){<br /> $image_arrys=kougabu_get_images("start=1&count=1&before=&after=&array=true&array_ext=true");<br /> foreach($image_arrys as $post_id=>$images ){<br /> $post_data = get_post($post_id);<br /> $title = $post_data->post_title;<br /> $permalink = get_permalink($post_id);<br /> $post_title = '<a href="' . $permalink . '">' . $title . '</a>';<br /> <br /> echo $post_title;<br /> echo '<br />';<br /> foreach($images as $image ){<br /> echo $image['link'];<br /> }<br /> echo '<br />';<br /> }<br /> }<br /> ?></code>
みたいな感じでも使えます。
2011 年 1 月 31 日 5:21 AM #3222匿名
ゲスト2通りのコードを試してみましたところ、
PHPコードにエラーがあります。( )
という表示が出てきてしまいました。
global $wpdb;を入れてみたり、
echoを部分をいじってみましたがダメみたいです。
QF-GetThumbだと“何番目の画像か”を指定できたので良かったのですが、
wp-kougabuプラグインだと投稿記事の画像すべてが対象ですよね。
毎回記事には、1番目と2番目の画像が同じサイズなので、
どちらかを指定できればいいのですが。
そう簡単なことではなさそうですね…。
いろいろやっていると、
どうしても欲が出てきてしました…(汗)
お手数おかけしまして申し訳ありません。
2011 年 2 月 1 日 12:41 AM #3223toemon
キーマスター「イメージの抽出はQF-GetThumbを使って」と言う条件で、ランダムでサムネイル付の記事を一つだけ引っ張りたいと言うのであれば、SQLで
$wpdb->posts の抽出条件として
post_typeが’post’であること、
post_statusが’publish’であること
post_contentに<img>あるいは<IMG>タグが含まれている
という条件で抽出し
ORDER BY rand()で並びをランダムする
というSQLを実行して、その結果をQF-GetThumbに渡す、ってのが一番簡単かもしれません。
「例」
<code><?php<br /> global $wpdb;<br /> $number = 1;<br /> $sql = "SELECT ID , post_title , post_content"<br /> . " FROM " . $wpdb->posts<br /> . " WHERE post_type = 'post'"<br /> . " AND post_status = 'publish'"<br /> . " AND post_content REGEXP '<img|<IMG'"<br /> . " ORDER BY rand()"<br /> . " LIMIT " . $number;<br /> if ($rows = $wpdb->get_results($sql)){<br /> foreach($rows as $row){<br /> $title = '<a href="' . get_permalink($row->ID) . '">'. $row->post_title . '</a>';<br /> echo $title;<br /> if(function_exists('the_qf_get_thumb_one')){<br /> echo the_qf_get_thumb_one("num=0&width=60","",$row->post_content);<br /> }<br /> }<br /> } else {<br /> echo "no data";<br /> }<br /> ?></code>
2011 年 2 月 1 日 11:04 AM #3224匿名
ゲスト度重なるアドバイスに感謝いたします。
kougabuプラグインのエラーについてはやや不明でしたが、
QF-GetThumbを使ったランダムで1つ画像を出力するという
イメージ通りの再現ができました。
WPの関数をいろいろと調べてみたいと思います。
お付き合いいただき
誠にありがとうございました。
2011 年 2 月 1 日 2:25 PM #3225toemon
キーマスターお望みの結果が得られて良かったですね ^^
kougabuプラグインのエラーについてはやや不明でしたが、
の件、ちょい話を戻して補足しておきます。
2通りのコードを試してみましたところ、
PHPコードにエラーがあります。( )
という表示が出てきてしまいました。
については、前述しました、
唯一、出力が何もない場合、PHP_Errorの表示が行われるというルール(バグ?)があります。
によるものです、つまり、コードからは何も出力されていない、状態だと思われます。(本来なら、「表示するデータがありません」とかいう表示が行われるべきでしょう、次期バージョンでは修正を行いたいと思います。)
なので、前述のkougabu_get_images()を使ったサンプルコードは
<code><?php<br /> if (function_exists('kougabu_get_images')){<br /> $image_arrys=kougabu_get_images("start=1&count=1&before=&after=&array=true&array_ext=true");<br /> if (count($image_arrys)){<br /> foreach($image_arrys as $post_id=>$images ){<br /> $post_data = get_post($post_id);<br /> $title = $post_data->post_title;<br /> $permalink = get_permalink($post_id);<br /> $post_title = '<a href="' . $permalink . '">' . $title . '</a>';<br /> <br /> echo $post_title;<br /> echo '<br />';<br /> foreach($images as $image ){<br /> echo $image['link'];<br /> }<br /> echo '<br />';<br /> }<br /> } else {<br /> echo 'No Data';<br /> }<br /> } else {<br /> echo 'Not found kougabu_get_images.';<br /> }<br /> ?></code>
みたいに、いくつかトラップを仕掛けておいた方が、原因の特定を行う手がかりになると思います。
2011 年 2 月 2 日 1:14 PM #3226匿名
ゲストkougabuプラグインの設定と拡張ブロックを
いただいたコードをもとに再度設置してみましたところ、
以下のようなエラーが出ました。
Warning: Invalid argument supplied for foreach() in ***/modules/xpress/wp-content/themes/xpress_default/blocks/my_rand2_block.php on line 5
ちょっと意味が分からないのですが、
ひとつ気になった点としましては、
WordPress の投稿やページにアップロードされた画像ファイルを抽出
とありますが、もしかすると、WPのエディターから画像をアップしていないことが
問題なのかなと思いました。
-
投稿者投稿
- このトピックに返信するにはログインが必要です。