Wordpressでアイキャッチ画像がない場合は、投稿の最初の画像<外部イメージ>を確認し、Eyecatch データとして画像をダウンロードしてアイキャッチとして設定する。
トリガーは<span class="hljs-comment">投稿保存時とする。</span>
functions.phpに下記を追加すると、投稿を保存時に自動的に投稿の最初の画像を取得し設定してくれるようになる。
※OpenAiのChatgptに作ってもらったコードです。また、コードの動作確認済です。
<span class="hljs-comment">// アイキャッチ画像が有効化されているかどうか確認</span>
<span class="hljs-keyword">if</span> ( <span class="hljs-title function_ invoke__">function_exists</span>( <span class="hljs-string">'add_theme_support'</span> ) ) {
<span class="hljs-title function_ invoke__">add_theme_support</span>( <span class="hljs-string">'post-thumbnails'</span> );
}
<span class="hljs-comment">// 投稿内の最初の画像を取得する関数</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">catch_first_image</span>() </span>{
<span class="hljs-keyword">global</span> <span class="hljs-variable">$post</span>, <span class="hljs-variable">$posts</span>;
<span class="hljs-variable">$first_img</span> = <span class="hljs-string">''</span>;
<span class="hljs-title function_ invoke__">ob_start</span>();
<span class="hljs-title function_ invoke__">ob_end_clean</span>();
<span class="hljs-variable">$output</span> = <span class="hljs-title function_ invoke__">preg_match_all</span>(<span class="hljs-string">'/<img.+src=[\'"]([^\'"]+)[\'"].*>/i'</span>, <span class="hljs-variable">$post</span>->post_content, <span class="hljs-variable">$matches</span>);
<span class="hljs-variable">$first_img</span> = <span class="hljs-variable">$matches</span> [<span class="hljs-number">1</span>] [<span class="hljs-number">0</span>];
<span class="hljs-comment">// デフォルトの画像を設定</span>
<span class="hljs-keyword">if</span>(<span class="hljs-keyword">empty</span>(<span class="hljs-variable">$first_img</span>)){
<span class="hljs-variable">$first_img</span> = <span class="hljs-string">"/images/default.jpg"</span>;
}
<span class="hljs-keyword">return</span> <span class="hljs-variable">$first_img</span>;
}
<span class="hljs-comment">// アイキャッチ画像がない場合に投稿内の最初の画像をダウンロードして設定する関数</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">auto_post_thumbnail</span>() </span>{
<span class="hljs-keyword">global</span> <span class="hljs-variable">$post</span>;
<span class="hljs-keyword">if</span> (!<span class="hljs-title function_ invoke__">has_post_thumbnail</span>(<span class="hljs-variable">$post</span>->ID)) { <span class="hljs-comment">// アイキャッチ画像がない場合</span>
<span class="hljs-variable">$attached_image</span> = <span class="hljs-title function_ invoke__">get_children</span>( <span class="hljs-string">"post_parent=<span class="hljs-subst">$post</span>->ID&post_type=attachment&post_mime_type=image&numberposts=1"</span> ); <span class="hljs-comment">// 投稿に添付された画像を取得</span>
<span class="hljs-keyword">if</span> (<span class="hljs-variable">$attached_image</span>) { <span class="hljs-comment">// 添付された画像がある場合</span>
<span class="hljs-keyword">foreach</span> (<span class="hljs-variable">$attached_image</span> <span class="hljs-keyword">as</span> <span class="hljs-variable">$attachment_id</span> => <span class="hljs-variable">$attachment</span>) {
<span class="hljs-title function_ invoke__">set_post_thumbnail</span>(<span class="hljs-variable">$post</span>->ID, <span class="hljs-variable">$attachment_id</span>); <span class="hljs-comment">// 最初の添付画像をアイキャッチとして設定</span>
}
} <span class="hljs-keyword">else</span> { <span class="hljs-comment">// 添付された画像がない場合</span>
<span class="hljs-variable">$first_image</span> = <span class="hljs-title function_ invoke__">catch_first_image</span>(); <span class="hljs-comment">// 投稿内の最初の画像を取得</span>
<span class="hljs-keyword">if</span> (<span class="hljs-variable">$first_image</span>) { <span class="hljs-comment">// 最初の画像がある場合</span>
<span class="hljs-keyword">require_once</span>(ABSPATH . <span class="hljs-string">'wp-admin/includes/file.php'</span>); <span class="hljs-comment">// ファイル操作用の関数を読み込む</span>
<span class="hljs-keyword">require_once</span>(ABSPATH . <span class="hljs-string">'wp-admin/includes/media.php'</span>); <span class="hljs-comment">// メディア操作用の関数を読み込む</span>
<span class="hljs-keyword">require_once</span>(ABSPATH . <span class="hljs-string">'wp-admin/includes/image.php'</span>); <span class="hljs-comment">// イメージ操作用の関数を読み込む</span>
<span class="hljs-title function_ invoke__">media_sideload_image</span>(<span class="hljs-variable">$first_image</span>, <span class="hljs-variable">$post</span>->ID); <span class="hljs-comment">// 最初の画像をメディアライブラリに追加する</span>
<span class="hljs-title function_ invoke__">set_post_thumbnail</span>(<span class="hljs-variable">$post</span>->ID, <span class="hljs-title function_ invoke__">get_attachment_id_from_src</span>(<span class="hljs-variable">$first_image</span>)); <span class="hljs-comment">// 追加した最初の画像をアイキャッチとして設定する</span>
}
}
}
}
<span class="hljs-title function_ invoke__">add_action</span>(<span class="hljs-string">'save_post'</span>, <span class="hljs-string">'auto_post_thumbnail'</span>); <span class="hljs-comment">// 投稿保存時に自動的に実行するようにフックする</span>
<span class="hljs-comment">// URLから添付ファイルIDを取得する関数</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">get_attachment_id_from_src</span> (<span class="hljs-params"><span class="hljs-variable">$image_src</span></span>) </span>{
<span class="hljs-keyword">global</span> <span class="hljs-variable">$wpdb</span>;
<span class="hljs-keyword">return</span> (<span class="hljs-keyword">int</span>)<span class="hljs-variable">$wpdb</span>-><span class="hljs-title function_ invoke__">get_var</span>(<span class="hljs-string">"SELECT ID FROM <span class="hljs-subst">{$wpdb->posts}</span> WHERE guid='<span class="hljs-subst">$image_src</span>'"</span>);
}
このコードでは、以下のことが行われます:
アイキャッチ画像がすでに設定されている場合は何もしない。 投稿内容から最初のimgタグ(HTMLタグで画像を表示するためのもの)を探す。
- imgタグからsrc属性(画像のURLを指定するためのもの)を取得する。
- src属性から画像URLが外部イメージ(自分のサイト以外にある画像)であるかどうか判定する。
- 外部イメージであれば、サーバーにダウンロードしてメディアライブラリ(WordPressで管理される画像やファイルの集合)に登録する。
- 外部イメージでなければ、メディアライブラリから画像に対応する添付ID(WordPressで管理される画像やファイルの識別番号)を取得する。
- 添付IDが取得できたら、アイキャッチ画像として設定する。
以上がコードの詳細や解説です。このコードをfunctions.php(WordPressのテーマファイルの一つで、テーマ全体に影響する機能や設定を記述するファイル)に追加すると、投稿を保存時に自動的に投稿の最初の画像をアイキャッチとして設定してくれるようになります。
この方法は、以下のようなメリットがあります:
- アイキャッチ画像がない場合でも、投稿内容に合った画像が表示されることで、読者への印象や興味を高めることができます。
- アイキャッチ画像を手動で設定する手間や時間を省くことができます。
- 外部イメージでもアイキャッチとして使えるようになります。
ただし、以下のような注意点もあります:
- 外部イメージは著作権や使用許可などに注意しなければなりません。無断でダウンロードしたり使用したりすると法的な問題が発生する可能性があります。