私はWordPressのプラグインを作りたい。
きっかけはこのテーマにも利用しているSWELLというテーマの制作者さんのこの記事です。
今まで既存テーマにカスタマイズするときは、子テーマのfunction.php
に書いていたのですが、管理のしやすさを考えるなら、プラグインにしたほうがいいカスタマイズもあったのではと思いました。というわけでプラグイン作ります!
個人的には、「自分の好きな場所にスライドショーを出せるプラグインをつくりたい。どうせなら、ブロックでかっこよく!」という熱い夢があります。とはいえ、最初から大きな目標を立てすぎると挫折してしまうので、今回は「ショートコードを設置している記事のタイトルを吐き出してくれるプラグイン(スタイルは問わない)」を作ってみたいと思います。あくまでも公に配布しない野良プラグインです。
まずは….
プラグインの作り方をWordPress Codex 日本語版内でググります。さきほど紹介した制作者さんのブログにもめちゃくちゃわかりやすく書いているのですが、今回の裏目標に「公式ドキュメントに慣れる」というものがあるので今回は公式から当たってみます!
そうすると、、このページに辿り着きました。どうやら最新版ではない(最新情報は英語ページ)のようですが、今回はプラグインに触れてみたいという気持ちが大半なのでこちらのページをみながらやっていきます。
やってみた
1.名前をつける
まずは名前をつけます。日本語文字列は使えません。基本英語表記と考えたほうが良さそうです。ドキュメントによると「プラグインの名前が被らないようにちゃんとしらべなさい」だそうです。ただ今回はあくまでもテストで、特に配布する予定もないので「My slider plugin」とします。
2.プラグインファイルをつくる
WordPressのテーマの最小単位はfunctuion.php
とStyle.css
というのは有名な話ですが、プラグインの最小単位はphpファイル一つだけだそうです。(ミニマム!)
というわけでここでは、その最小限のphpファイルを作ります。プラグイン名に倣ってmy-slider.php
とし、wp-content/plugins/
に設置します。※また今後特に説明のない「phpファイル」はmy-slider.php
を指します。
3.プラグインの情報を書く
テーマのstyle.css
にテーマの情報を書くように、プラグインもphpファイルにプラグインの情報を書きます。Codexによると、以下のような情報をかくそうです。この中のうち、最低限「Plugin Name」を書けば、読み込んでくれるのだそう..!
<?php
/*
Plugin Name: (プラグインの名前)
Plugin URI: (プラグインの説明と更新を示すページの URI)
Description: (プラグインの短い説明)
Version: (プラグインのバージョン番号。例: 1.0)
Author: (プラグイン作者の名前)
Author URI: (プラグイン作者の URI)
License: (ライセンス名の「スラッグ」 例: GPL2)
*/
/*WORDPRESS CODEX 日本語版「プラグインの作成」より抜粋 */
?>
今回は「Plugin Name」と「Description」「Version」「Author」を記入してみます!
Codexには書かれていないのですが、ブラウザからphpファイルのURLを叩かれても中身を見られないようにif ( ! defined( 'ABSPATH' ) ) exit;
と入れると良いようです。(参考:https://wemo.tech/3878)
ただ、おまじない認識のままでいるのは悔しいので、別の記事でこのコードに内容も考えてみます。
(2021/09/24追記)if ( ! defined( 'ABSPATH' ) ) exit;
というコードを分解して考えてみたという記事を投稿しました!
<?php
/*
Plugin Name: My Slider Plugin
Description: プラグイン作成の第一歩!
Version: 1.0
Author:玄米
*/
if ( ! defined( 'ABSPATH' ) ) exit;
ちなみにここまでやると管理画面でプラグインが認証されています…!(感動)
4.プラグインの動作を作る
というわけで動作部分です!
今回は(コードを登録する記事)のタイトルを吐き出してくれるだけのショートコードを登録しました。
//現在の記事のタイトルを出力する関数
$now_post_id = get_the_ID();
function title_list_func($now_post_id){
return get_the_title();
}
add_shortcode('thetitle','title_list_func');
ちなみにreturn get_the_title();
の部分ですが、echo get_the_title();
とすると、うまく表示出来ませんでした。。しっかり原因を調べきれていないのですが、こちらの記事でも言及されていたようにおそらく呼び出す順番が変わってくる?のではないかとおもいました。(元記事さんの受け売りですが、後々どういうことなのか調べます)
また当初はループを使ってやろうと以下のコードを書いていたのですが、無限ループにハマってしまいました…
ループ、サブループ、関数etcの理解が甘いので、ちょっとすぐに原因を見つけられそうになかったので今回は前者の方のコードで作成しました。
//無限ループになったやつ
function title_list_func(){
if (have_posts()):
//投稿がある間はwhile内の処理をする
while(have_posts()):
//タイトルを出力する
the_title('<h3>', '</h3>');
endwhile;
// もし投稿がなければ(forthであれば)
else :
echo "投稿がみつかりません!!!";
endif;
}
add_shortcode('thetitle','title_list_func');
これはまじで無限ループしちゃうので絶対に入れちゃダメです。
呪いのパソコンみたいになります。。
ただどうやら、have posts()を関数内で呼び出すと無限ループが発生する(By Codex)らしいのでおそらくその辺りかなぁとあたりをつけています。
5.有効化してみる
ではお待ちかねの有効化をして、ページの任意の場所に[thetitle]
と入れてみると…..
地味!だけど確かにショートコードを入れた記事のタイトルが出力されてる…!!!!!感動…
まとめ
というわけで今回は「現在の記事のタイトルを吐き出してくれる」プラグインを作りました。まあ千里の道も一歩から、なので地道にプラグイン作成やっていきたいと思います。
今回の課題として以下の課題が出てきました。
- ループで記事を取得しようとした時の無限ループ問題
if ( ! defined( 'ABSPATH' ) ) exit;
というコードの意味- 記事を書きました!(2021/09/24)
- 関数を作ったときの、echo にすると思うような場所に表示されない問題。
- そもそもreturn とecho の違いをちゃんと私は説明できるのか問題。
一つずつ解決していこうと思います。今後に乞うご期待!
(WordPressを手動復元してみた!記事も出します!)
参考資料
今回の参考サイト・ページです。ありがとうございました!
プラグインの作成
中身の処理部分
ショートコード化について
タイトル取得関係
ループ関係
このあたりは今回全く活かせなかった。。
コメント