カテゴリ「メモ」[45件]
259
もういっそ縫い撮り関係の写真もこうやって一覧にしたら俺が楽しいんじゃない?と思ってカテゴリ増やして部屋も増やした んですが、ここら辺は別に更新履歴に載せなくて良いなーと思ったので、ようやくなんとか出来た先日のPHPを早速改変する必要が出て来てしまった訳です。お前はいつもそうだ。途中、無が出力されてRSS通知が真っ白になったり、除外は出来たものの何故か今まで入れられてた画像更新の履歴が他URLに負けて出て来なくなったりもしましたが、何とか形になりました。多分。
後から思い付きで色々やるからそうなる。
あとついでだったので未分類も更新に出ないようにしました。まあ基本未分類になってるのはカテゴリ付け忘れミスなんですけれども。
<?php畳む
header('Content-Type: application/rss+xml; charset=UTF-8');
// XML ヘッダ
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<rss version="2.0"><channel>';
echo '<title>Media Gallery Feed</title>';
echo '<link>' . home_url('/') . '</link>';
echo '<description>Media Gallery RSS</description>';
// 親カテゴリマップ
$parent_map = [
'processed' => '加工写真',
'knyacki' => 'ニャッキ',
'rtr' => 'ドット絵化',
'jpeg' => 'Jpeg圧縮',
];
// 除外条件
$exclude_parent_slug = 'nui'; // 親に nui がいたら除外
$exclude_term_slug = 'uncategorized'; // 未分類を除外
// RSS表示用カテゴリ判定
function get_rss_category_info($post_id, $parent_map, $exclude_parent_slug, $exclude_term_slug) {
$terms = wp_get_post_terms($post_id, 'category');
if (empty($terms) || is_wp_error($terms)) return false;
// 除外判定
foreach ($terms as $term) {
if ($term->slug === $exclude_term_slug) return false;
$ancestors = get_ancestors($term->term_id, 'category');
foreach ($ancestors as $aid) {
$ancestor = get_term($aid, 'category');
if ($ancestor && $ancestor->slug === $exclude_parent_slug) {
return false;
}
}
}
// RSS表示用カテゴリ決定
foreach ($terms as $term) {
$ancestors = get_ancestors($term->term_id, 'category');
if ($ancestors) {
$top = get_term(end($ancestors), 'category');
// photo → 孫カテゴリ
if ($top && $top->slug === 'photo' && count($ancestors) >= 2) {
$child = get_term($ancestors[count($ancestors) - 2], 'category');
return [
'key' => 'photo/' . $child->slug . '/' . $term->slug,
'name' => $term->name,
'link' => home_url("/photo/{$child->slug}/{$term->slug}/")
];
}
// その他 → 親カテゴリ
if ($top && isset($parent_map[$top->slug])) {
return [
'key' => $top->slug,
'name' => $parent_map[$top->slug],
'link' => home_url("/{$top->slug}/")
];
}
} else {
if (isset($parent_map[$term->slug])) {
return [
'key' => $term->slug,
'name' => $parent_map[$term->slug],
'link' => home_url("/{$term->slug}/")
];
}
}
}
return false;
}
// 画像添付投稿取得
$attachments = get_posts([
'post_type' => 'attachment',
'post_mime_type' => 'image',
'numberposts' => 50,
'orderby' => 'date',
'order' => 'DESC',
]);
if ($attachments) {
$grouped = [];
// 60分 + カテゴリ単位でまとめ
foreach ($attachments as $post) {
$id = $post->ID;
$time = strtotime($post->post_date);
$cat = get_rss_category_info(
$id,
$parent_map,
$exclude_parent_slug,
$exclude_term_slug
);
if (!$cat) continue;
$found = false;
foreach ($grouped as &$g) {
if (
$g['key'] === $cat['key'] &&
abs($g['time'] - $time) <= 3600
) {
$g['ids'][] = $id;
$found = true;
break;
}
}
if (!$found) {
$grouped[] = [
'time' => $time,
'ids' => [$id],
'key' => $cat['key'],
'name' => $cat['name'],
'link' => $cat['link'],
];
}
}
// <item> 出力
foreach ($grouped as $g) {
$rep_id = $g['ids'][0];
$date = get_the_date('Y.m.d', $rep_id);
$extra_count = max(0, count($g['ids']) - 1);
$extra_text = $extra_count ? "(他{$extra_count}枚)" : '';
echo '<item>';
echo '<title><![CDATA[' . $date . ' - ' . $g['name'] . ' - #' . $rep_id . $extra_text . ']]></title>';
echo '<link>' . esc_url($g['link']) . '</link>';
echo '<guid>media-gallery?id=' . $rep_id . '</guid>';
echo '<pubDate>' . get_the_date('r', $rep_id) . '</pubDate>';
echo '<source url="' . esc_url($g['link']) . '">' . $g['name'] . '</source>';
echo '</item>';
}
}
echo '</channel></rss>';
?>
結果的には'numberposts' =>の値を変えた(RSSに載せない写真を大量にアップしたので通知させたい写真が後ろに流れ感知しなくなったっぽい)のと、
// 除外条件を追加したくらいなんですけれども、入れる位置とかで色々挙動が意図しないことになったりしたのでPHPって難しいですね…
$exclude_parent_slug = 'nui'; // 親に nui がいたら除外
$exclude_term_slug = 'uncategorized'; // 未分類を除外
#WordPress
257
わーい画像部屋のRSSがなんとかなったので更新履歴に自動で反映されるようになったよー!しばらくphpと戦ってたので以下メモです。
まず画像部屋のfunctions.phpに
add_action('init', function() {
add_feed('media-gallery', function() {
load_template(get_stylesheet_directory() . '/feed-media-gallery.php');
});
});
と書きまして、通常フィードとは別のフィードを出力するようにしました。
名前は何でも良いんですけど、今回は記事や固定ページではなく画像をアップロードしたことを通知するフィードを作りたかったのでmedia-galleryにしました。
これでhttps://ワードプレス/feed/media-gallery/というアドレスにアクセスすればRSSを読み込む挙動になりました。まだ中身何にもないですけど。
で、functions.phpと同じ場所にfeed-media-gallery.phpを作成します。
中身は空でもアップロードすればワードプレス側で弄れるので大丈夫だと思います。
結論から言うと、そこに以下の記載をしています。
header('Content-Type: application/rss+xml; charset=UTF-8');
// XML ヘッダ
echo '<?xml version="1.0" encoding="UTF-8"?>';
echo '<rss version="2.0"><channel>';
echo '<title>Media Gallery Feed</title>';
echo '<link>' . home_url('/') . '</link>';
echo '<description>Media Gallery RSS</description>';
// 親カテゴリマップ
$parent_map = [
'knyacki' => 'ニャッキ',
'rtr' => 'ドット絵化',
'jpeg' => 'Jpeg圧縮',
];
// 画像添付投稿を取得
$attachments = get_posts([
'post_type' => 'attachment',
'post_mime_type' => 'image',
'numberposts' => 50,
'orderby' => 'date',
'order' => 'DESC',
]);
if ($attachments) {
$grouped = [];
$processed_ids = []; // 重複防止
// 120分以内のまとめ処理
foreach ($attachments as $post) {
$id = $post->ID;
$time = strtotime($post->post_date);
$found = false;
foreach ($grouped as &$g) {
if (abs($g['time'] - $time) <= 7200) { // 120分以内
$g['ids'][] = $id;
$found = true;
break;
}
}
if (!$found) {
$grouped[] = ['time' => $time, 'ids' => [$id]];
}
}
// <item> 出力
foreach ($grouped as $g) {
$rep_id = $g['ids'][0];
// 重複チェック
if (isset($processed_ids[$rep_id])) continue;
$processed_ids[$rep_id] = true;
$date = get_the_date('Y.m.d', $rep_id);
$terms = wp_get_post_terms($rep_id, 'category');
$cat_name = '未分類';
$link = home_url('/');
// カテゴリ URL 作成
foreach ($terms as $term) {
$ancestors = get_ancestors($term->term_id, 'category');
if ($ancestors) {
$top = get_term(end($ancestors), 'category');
// photoカテゴリは孫カテゴリまで取得
if ($top && $top->slug === 'photo' && count($ancestors) >= 2) {
$child = get_term($ancestors[count($ancestors) - 2], 'category');
$grandchild = $term;
$cat_name = $grandchild->name;
$link = home_url('/') . "photo/{$child->slug}/{$grandchild->slug}/";
break;
} elseif ($top && isset($parent_map[$top->slug])) {
$cat_name = $parent_map[$top->slug];
$link = home_url('/') . "{$top->slug}/";
break;
}
} elseif (isset($parent_map[$term->slug])) {
$cat_name = $parent_map[$term->slug];
$link = home_url('/') . "{$term->slug}/";
break;
}
}
// 追加画像数
$extra_count = max(0, count($g['ids']) - 1);
$extra_text = $extra_count > 0 ? "(他{$extra_count}枚)" : '';
echo '<item>';
echo '<title><![CDATA[' . $date . ' - ' . $cat_name . ' - #' . $rep_id . $extra_text . ']]></title>';
echo '<link>' . esc_url($link) . '</link>';
echo '<guid>media-gallery?id=' . $rep_id . '</guid>';
echo '<pubDate>' . get_the_date('r', $rep_id) . '</pubDate>';
echo '<source url="' . esc_url($link) . '">' . $cat_name . '</source>';
echo '</item>';
}
}
echo '</channel></rss>';
先に書いたように、記事や固定ページではなく画像をアップロードしたこと…メディアライブラリに追加があったことを感知するようにしました。
まあざっくりしたことは(自分が忘れるので)php内にコメントアウトで書いてあるのですが、
親カテゴリマップというのはRSSでカテゴリスラッグがそのまま出て来ても分かりにくいため名前を分かりやすく変換するやつですね。
この辺り表示名付けてるのでそっちを利用すればイチイチ指定しなくてもなんとかなりそうですが、数が少なくて面倒でもないのでとりあえずこうしてあります。
重複防止と120分以内のまとめ処理は画像をまとめてアップした際に更新履歴が埋まらないようにする為です。
そんなに更新に時間かからないとかもっと即座に更新反映させたいとかなら30分とかもっと短くても良さそうですね。
自分の場合は画像溜め込むことがあるのと即時反映に拘ってないので120分にしました。こんなに長くなくても良い気はしますが。
あとギャラリー化するにあたって画像にカテゴリ付けをしているので、その親カテゴリーで分類、特定のカテゴリ(photo)に関しては孫まで掘って孫で判断するようにしています。
カテゴリ付けに関してはプラグインを利用しています。『WordPress メディアライブラリ カテゴリ付け』辺りの単語で検索すると色々出て来るので良さそうなの入れると良いと思います。もしかしたら今回のPHPだと相性悪くて反応しないのあるかもですけど。
とりあえず私が使っているのはCategories Images です。
あ、それとパーマリンクを/親カテゴリ/(子カテゴリ/孫カテゴリ/)としているのでリンクも更新した画像に直接飛ぶのではなく、カテゴリ別画像一覧ページに飛ぶ感じで作ってますね。
で、画像部屋のRSSはこんな感じなんですが、読み取って更新履歴として表示させる方がブログタイトルを読み込む仕様にしてあるので、このままだと2026/01/20 - Media Gallery Feed - 2026/01/10 - yell vogue - #1139(他5枚)
みたいになってしまうので、
出力の方のfunctions.phpに
if ( strpos( $item->get_feed()->subscribe_url(), 'gallery/feed/media-gallery' ) !== false ) {
echo esc_html( $title );
} else {
echo esc_html( $date ) . ' - ';
echo esc_html( $feed_title ) . ' - ';
echo esc_html( $title );
}
という記載をしてあります。
なんでわざわざfeed-media-gallery.phpの方で記事タイトル扱いで日付を表示させて、出力の方のfunctions.phpで$dateを表示させない形にしているかというと投稿日付の表示が怪しくなったからです。
多分ちゃんと出来るひとならfeed-media-gallery.phpの方でecho esc_html( $date )抜いて出力の方のfunctions.phpでecho esc_html( $feed_title )だけ抜く形になるんじゃないかな…。
まあとりあえずこの形で問題なく動くのでこうしています
畳む
#WordPress
252
写真部屋(とJPEG圧縮画像とニャッキ写真)を一新しました。ついでにカメラのアイコンも増やしました。
ずぼろぐ使ってたんだけどカメラ毎に分けてると色々めんどくさくて…
基本はワードプレスでテーマはBlockbaseで子テーマを用意して、それ以外だとメディアライブラリにカテゴリ付けられるプラグインとカテゴリの並び替えができるようになるやつとクラシックエディタと固定ページや投稿ごとに個別CSS使えるようにするプラグインを使ってあとは割と人力でなんとかしました。デザインは諦めました。
造りとしてはメディアライブラリで親カテゴリとして写真と圧縮画像とニャッキとを分けて、写真ページではそこから更に子カテゴリでカメラ分類、孫でカメラ個別と分けて、個別ページに最新から少し表示させる一覧を、詳細ページは投稿ページにページネーション付きで多めの画像を一定数表示する感じ。
投稿ページにしたのは固定ページのページ数が増えるのが嫌だったからです。とはいえ投稿へのリンクも個別名称つける形にしてるので固定ページとあんまりやってることは変わらないです。実際JPEG圧縮とニャッキは固定ページにで写真部屋の詳細ページと同じことしてるので。
人力故にどこかでエラーとか不具合とかあるかも知れません。あったら教えてください
自分でPHP組んだせいか投稿記事などで機能する筈のプラグインを入れても機能しないことがあるので、テーマ配布してる人はすごいなぁと思います。
233
でーきーましたわー!!!苦労しただけあってHTMLの構造が当初と比べて大分シンプルになった…気がする。当社比。
CSSはうん…長いね…これはもう仕方ない…
最初はネタで作ってたんですが本適用しました。
色は流石にそのままはどうかと思ったとの趣味で青くしました。
メインページっぽい作りにしてる他のページは順次変えます。
…と思ったけど
はギャラリーモード使ってるから今の状態にするにも結構苦労したんだよなぁ。まあおいおいやりますうん。しかしRSSのデザインがそのままですね。CSS変えたんだけどなぁ?おかしいなぁ。まあいいかで当面このままです。
【8/4追記】
直しましたイェーイ
サイドとメインの箱位置はpaddingだったんですが、RSSの方はどうにも読み込ませたくないCSSを読み込んでしまうのが理由だったので、個別ページのカスタムJSに
let url = window.location.href;畳む
let indextext = url.indexOf('URL内の特定の文字列');
if (indextext) {
let links = document.getElementsByTagName("link");
for (let i = 0; i < links.length; i++) {
if (links[i].href.includes("style.css")) {
links[i].parentNode.removeChild(links[i]);
}
}
}
と入れて読み込んでしまうCSSを無効化し、同じページ内でカスタムCSSでリンク色等を指定したらいけました。
無暗にサイトの改装する方な自覚はあるんですけど、HTMLいじりが趣味みたいなところがあるので…
#WordPress
232
youtube埋め込めるようになったぞわーいと思って埋め込んでみたものの、自分の環境だとスマホから見た際にレイアウトが崩れるようになったのでどうにか埋め込んだyoutubeのサイズを弄れないかなーと思ったんですが、てがろぐ本体の設定で、【投稿本文の表示/URL処理】の▼URL自動リンクの特殊表示化のURLの直前に[YouTube]ラベルがあれば動画を埋め込むで、埋め込みサイズの部分に%入れるとブラウザサイズによって伸縮するようになるんですね。とりあえずこの欄の横幅指定部分に100%と入れたらレイアウト崩れがなくなりました。
CSSで指定も出来るっぽいですが上手くいかなかったので、とりあえずこれで良いかな
#てがろぐ

new