久しぶりのWordpressネタです。
次のVer.3からはマルチブログにも対応するなど、このところ進み具合が半端無い感じのWPですが(アップグレードでコケるところ多そうだなぁ…)。
ページ内で記事の一覧とそのサムネイル画像を表示させたい、という要求は往々にしてあると思うのですが、それをなんとか使用者にも使いやすい形で実装できないものか…と。
最初に考えたのはカスタムフィールドを使用して、アップロードしたファイルのURLを入れてもらう。。。は手間が増えるし、おそらくイマイチ分かりにくい操作だなぁ。。。と。
記事内の最初に出てくる画像を正規表現で取得して…矩形のサムネイルだと良いけど、中・大の画像サイズとファイル名が不明…
Ver 2.9から実装されているthe_post_thumbnail()はなにも表示されない…
ということで実装したのがこちら、
PHP:
-
$posts = get_posts('numberposts=5&category=3');
-
foreach($posts as $post) {
-
setup_postdata($post);
-
-
$dat = get_posts('post_type=attachment&orderby=menu_order&order=ASC&numberposts=1&post_parent='.get_the_ID());
-
-
$image = wp_get_attachment_image_src($dat[0]->ID);
-
$desc = '<img src="'.$image[0].'" width="'.$image[1].'" height="'.$image[2].'" alt="" />';
-
}
-
-
// 記事出力
-
-
}
get_posts()にパラメータ「post_type=attachment」を指定すると、「post_parent」に与えた記事IDに紐付いているデータを取得できます。その他のパラメータは並び順の先頭にある1件のみを取得する指定です。ギャラリーダイアログで1番上に指定している物を取得する仕様にしました。
配列にはそれぞれファイルURL・幅・高さが入っています。
お客さんにはサムネイルに表示したい画像をアップロード、1番上に移動してもらうだけ。記事内にその画像を表示させたくなければ挿入しなければ良いだけで、ギャラリーの1番上にある画像が自動的に表示されるのは分かりやすいかな?と(サムネイルは表示させたくないけど、記事中に何か画像を表示したい、という希望には添えませんが…orz)。
次のネタは「ページ内で記事を表示させたい。そしてページングも表示させたい」です。ネタは小出しでw
ラーメン屋のネタを華麗にスルーしつつ、タイトルの長すぎるエントリーです。
しかも解説無しという暴挙!読者をなんだと思ってるんだ!
Wordpressで記事に投稿した画像一覧をProgression用のXMLで出力するためのテンプレートです。
(元ネタはこちらを参考にさせて頂きました。深謝)
PHP:
-
<?php /*
-
Template Name: scenedataXML
-
*/ ?>
-
<?php header('Content-Type: text/xml; charset='.get_option
('blog_charset'),
true);
?>
-
<?php echo '<?xml version="1.0" encoding="'.get_option
('blog_charset').
'"?'.
'>';
?>
-
<?php echo '<prml version="2.0.0" type="text/prml">';
?>
-
-
<?php query_posts("order=DESC"); ?>
-
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
-
<?php
-
$d = the_date('Y-m-d', '', '', '', false);
-
$attachments = get_children
(array('post_parent' => get_the_ID
(),
'post_type' =>
'attachment',
'post_mime_type' =>
'image'));
-
-
foreach ($attachments as $key => $row) {
-
$mo[$key] = $row->menu_order;
-
$aid[$key] = $row->ID;
-
}
-
-
foreach ($attachments as $row => $data) {
-
preg_match('/src="(.*?)"(.*?)title="(.*?)"/ie', wp_get_attachment_image
($data->
ID,
'thumbnail'),
$thumb);
-
preg_match('/src="(.*?)"(.*?)title="(.*?)"/ie', wp_get_attachment_image
($data->
ID,
'full'),
$image);
-
?>
-
<scene name="<?php echo the_title(); ?>" cls="myproject.scenes.ImageScene" title="<?php echo $image[3]." | ";the_title(); ?>">
-
<num><?php
echo $image[3]; ?></num>
-
<cap><?php
echo $image[3]; ?></cap>
-
<thumb><?php
echo $thumb[1]; ?></thumb>
-
<path><?php
echo $image[1]; ?></path>
-
<date><?php
echo $d; ?></date>
-
<category><?php
$cat = get_the_category
();
$cat =
$cat[0];
{ echo $cat->
cat_name;
} ?></category>
-
</scene>
-
<?php
-
}
-
}
-
?>
-
<?php endwhile; endif; ?>
Progressionはプログラミングの知識がなくても柔軟且つ簡単ににフルフラッシュサイトを作れる工夫が成されてる割に、細かいことをやろうとしたら意外に奥が深いフレームワークです。ちょっと世界観の把握に苦労した。
あとはこの出力されたXMLをProgressionで読んで、Papervision3Dと絡めて…
という実験的勉強を、クライアントからの連絡をずーっと待ちながらイヂけつつやっている梅雨が明けたある暑い夏の日。
フロントページを“固定”にして、投稿ページを何かに指定した場合、ページスラッグは入力した物じゃなくて投稿のタイトルがエンコードされた物が返ってくる。
ページスラッグを利用してページごとのCSSを読み込むようにしていたので、ここで大はまり。で、ナニをどうやっても投稿ページで指定しているスラッグを引っ張れないので考えた案。
投稿ページを指定すると、そのページはis_page()がfalseになるので、(逆説的に)is_page() === trueの場合のみページスラッグを使ってCSSを指定し、falseの時は投稿ページと判断して、ブログ用のCSSを読み込ませる。
#Ver2.7.1でのお話です。他にも別の解決策などあるかもしれません。
というかページテンプレートも指定できなくなるのは仕様なのか?