はじめに
この記事で書くのは、Wordpressでゴリゴリにコーディングする話です。
Wordpressの機能でできることや、プラグインでできそうなことはわざわざコードを書く必要はないですが、必要に迫られることがあるかもしれません。
たとえば、プラグインAで作ったデータ構造が複雑すぎて、組み合わせて使う予定だったプラグインBでうまく使えないとか。
特定の機能を作りたい場合があるかもしれないですね。
Wordpressってなに?
以下抜粋。https://ja.wordpress.org/ より
WordPress とは
WordPress (ワードプレス) は、ブログから高機能なサイトまで作ることができるオープンソースのソフトウェアです。
世界中で使われる最高の信頼
Web 上の43%のサイトが WordPress を使っています。個人ブログから大規模なニュースサイトまで用途はさまざまです。
WordPressをローカルでちょっと試すときにオススメなアプリ
これを入れればすぐにローカルでサイトが立ち上げられます。
コード触る時はこれを使ってます
軽くコードを書いてみよう
おためしでakasatana
というサイトを作ってみました。
これが管理画面です。左メニューのPagesからページを作成します。
今回はKumaページを作ってみました。
/kuma
ではアクセスできますが/kumasan
ではアクセスできません。
これを/kumasan
でもアクセスできるようにします。
テーマに処理を書く
使用しているテーマ/functions.phpに処理を書きます。
参考 Theme Functions
使用しているテーマを確認する
wp-admin/themes.php
で確認することができます。
ここではTwenty Twenty-ThreeがActivateされてます。
使用しているテーマ/functions.phpの場所
siteのfolderはこのような構成になっているはずです。
wp-content/
wp-admin/
wp-includes/
...
index.php
より詳しい情報はこちら WordPress のコードはどのように構成されているか
wp-content/themes/
配下にテーマのディレクトリがあります。
wp-content/themes/
├── index.php
├── twentytwentyone
├── twentytwentythree
└── twentytwentytwo
例のサイトではこのようになってます。
現在ActivateしているテーマはTwenty Twenty-Three
なので、twentytwentythree/functions.php
に処理を書きます。
twentytwentytwo
,twentytwentyone
はもともとfunctions.php
があるので、下記の緑掛けの箇所を追記してください。
<?php
+ add_action('init', 'rewrite_rules');
+
+ function rewrite_rules() {
+ add_rewrite_rule(
+ '^kuma',
+ 'index.php?pagename=kuma',
+ 'top'
+ );
+ }
追加したコードの解説
add_actionとは
WordPress開発をするために知っておくべきことがあります。
フックです。 フックはWordPressの処理フローのさまざまなポイントに独自の処理を差し込むための仕組みです。
フックにはアクションとフィルターの2種類があります。
add_action() と add_filter() 関数を呼ぶことで処理を登録できます。第1引数に処理を差し込むタイミング、第2引数に差し込む処理を指定します。
アクションとフィルターの違いについてですが、大きな違いは、アクションは値を返しませんが、フィルターは値を返します。詳しく知りたい方はこちら
add_actionで何をしている?
add_action('init', 'rewrite_rules');
第1引数でinit
を指定しています。WordPress の読み込みが完了した後、ヘッダーが送信される前に発生します。initについて
第2引数でfunction rewrite_rules
を指定しているので、WordPress の読み込みが完了した後、 rewrite_rules() が呼び出されます。
rewrite_rulesで何をしている?
function rewrite_rules() {
add_rewrite_rule(
'^kuma',
'index.php?pagename=kuma',
'top'
);
}
rewrite_rules() は1つの関数を呼び出します。add_rewrite_rule()です。第1引数の正規表現に合致するURLの場合に、第2引数のURLのページを表示します。第3引数はルールの優先度です。
コードを追加しただけでは、rewrite_rulesは効かないので、この段階ではまだ/kumasan
は404になります。
wp-admin/options-permalink.php にアクセスしてSave Changesボタンをクリックします。
これでrewrite_rulesが反映されて、/kumasan
でも200になるようになりました。
Pluginを作る
管理画面にクリスマスまでのカウントダウンを表示するプラグインを作ってみましょう。
プラグインフォルダとファイルを作る
Countdownという名前のプラグインを作ります。
wordpress $ cd wp-content/plugins
plugins $ mkdir countdown
plugins $ touch countdown/countdown.php
プラグインのヘッダーを書く
<?php
/**
* Plugin Name: Countdown
*/
今回は最小限でプラグインの名前だけ書きましょう。他には、バージョンや作成者などの情報が定義できます。
参考: https://developer.wordpress.org/plugins/plugin-basics/header-requirements/
wp-admin/plugins.php
を確認してみましょう。
Countdownが追加されています。
Descriptionがないのは寂しいので、追加してみましょう。
<?php
/**
* Plugin Name: Countdown
+ * Description: 管理画面にクリスマスまでのカウントダウンを表示します。
*/
wp-admin/plugins.php
をリロードします。
Activateを押して有効化しましょう。
この段階ではまだ処理が入ってないので、管理画面にクリスマスまでのカウントダウンは表示されません。
クリスマスへのカウントダウンを実装しよう
表示部分の処理を書く
ファイルを作成しましょう。
plugins $ cd countdown
countdown $ mkdir admin
countdown $ touch admin/admin.php
<?php
/**
* 管理画面のための処理を書くファイル
*/
/**
* @link https://developer.wordpress.org/reference/hooks/all_admin_notices/
*/
add_action('all_admin_notices', 'the_countdown');
/**
* クリスマスまでのカウントダウンを表示する
*
* @return void
*/
function the_countdown() {
$now = date_time_set(date_create('now', wp_timezone()), 0, 0, 0, 0);
$xmas = date_time_set(date_create_from_format('m-d', '12-25', wp_timezone()), 0, 0, 0, 0);
$diff = date_diff($now, $xmas);
if (wp_date('m') !== 12 || $diff->invert === 1) {
return;
}
?>
<div class="countdown">
<?php the_xmas_line();?>
<p class="countdown__content">
クリスマスまであと<span class="countdown__date"><?php echo $diff->format('%a'); ?></span>日
<?php the_countdown_img(); ?>
</p>
<?php the_xmas_line(); ?>
</div>
<?php
}
/**
* カウントダウンの画像を表示する
*
* @return void
*/
function the_countdown_img() {
$img_file = 'assets/img/' . wp_date('d') . '.png';
if(!file_exists(COUNTDOWN_PATH . $img_file)) {
$img_file = 'assets/img/not_found.png';
}
?>
<img class="countdown__img" src="<?php echo COUNTDOWN_URL . $img_file;?>">
<?php
}
/**
* カウントダウンをデコレーションするラインを表示する
*
* @return void
*/
function the_xmas_line() {
?>
<div class="countdown__line">
<img src="<?php echo COUNTDOWN_URL . 'assets/img/line_hiiragi.png';?>">
<img src="<?php echo COUNTDOWN_URL . 'assets/img/line_bell.png';?>">
</div>
<?php
}
管理画面のお知らせを表示するhookでthe_countdown
を呼び出しています。
12月ではない、または、クリスマスを過ぎている場合には何も表示されません。
あとx日
のxには、クリスマス当日を含みません。クリスマス当日にはあと0日
と表示されます。
画像は、表示日の名前のファイルを表示します。たとえば、今日が12/1なら、countdown/assets/img/1.png
が表示されます。12/11なら、countdown/assets/img/11.png
。
表示日の名前のファイルがない場合には、countdown/assets/img/not_found.png
を表示します。
各関数の頭についているthe_
はwordpressでprintされる関数でよく使われてる接頭辞です。
もしこの記事を12月以外で試す場合には、the_countdown
関数のreturnをコメントアウトしてください。
if (wp_date('m') !== 12 || $diff->invert === 1) {
// return;
}
今の段階では、admin.phpが呼ばれることはありません。
countdown.phpで呼び出す必要がありますが、その修正は最後に行います。
styleを追加しよう
ファイルを作成しましょう。
countdown $ mkdir core
countdown $ touch core/settings.php
<?php
/**
* 初期設定を行うためのファイル
*/
namespace CountDown;
add_action('init', 'CountDown\\load_css');
function load_css() {
if(is_admin()){
wp_enqueue_style('countdown_admin', COUNTDOWN_URL . 'assets/css/admin.css', [], true);
}
}
管理画面の時はplugins/countdown/assets/css/admin.css
を呼び出すように指定しました。
これはお試しのコードなので、cssを毎回再読み込みする指定をwp_enqueue_style
の4つ目の引数でしています。
cssファイルを作成しましょう。
countdown $ mkdir assets
countdown $ mkdir assets/css
countdown $ touch assets/css/admin.css
.countdown {
align-items: center;
display: flex;
justify-content: center;
width: 100%;
}
.countdown__content {
width: 20%;
display: flex;
align-items: center;
justify-content: center;
margin: 0px 4px;
}
.countdown__date {
color: red;
font-size: 150%;
margin: 0px 2px;
}
.countdown__img {
width: 50%;
}
.countdown__line {
width: 40%;
display: flex;
flex-wrap: wrap;
}
.countdown__line > img {
width: 100%;
}
.countdown__line:first-child {
justify-content: end;
}
画像ファイルを追加しよう
フォルダを作成しましょう。
countdown $ mkdir assets/css/img
この記事ではいらすとやさんの画像を使用させていただきました。
https://www.irasutoya.com/2021/01/chopper.html
https://www.irasutoya.com/2015/12/blog-post_96.html
https://www.irasutoya.com/2015/12/blog-post_69.html
img配下に、not_found.png、line_bell.png、line_hiiragi.png、{日付}.pngを追加しましょう。
定義の追加とファイル呼び出しをしよう
<?php
/**
* Plugin Name: Countdown
* Description: 管理画面にクリスマスまでのカウントダウンを表示します。
*/
+ define('COUNTDOWN_PATH', plugin_dir_path( __FILE__ ));
+ define('COUNTDOWN_URL', plugin_dir_url( __FILE__ ));
+
+ include COUNTDOWN_PATH . 'core/settings.php';
+ include COUNTDOWN_PATH . 'admin/admin.php';
確認
管理画面のいろんなページを見てみましょう
おわり
どうでしたでしょうか?簡単にプラグインの追加方法など記載しました。
冒頭でふれた たとえば、プラグインAで作ったデータ構造が複雑すぎて、組み合わせて使う予定だったプラグインBでうまく使えないとか。
ですが、Wordpressのプラグインの中には、独自のhookを用意しているものもあり、処理を差し込んだりできます。
Wordpress上の開発はなかなか面白いので、興味があればぜひやってみてください。
おまけ
日付計算の部分、初めはこう書いてました。
$now = date_create('now', wp_timezone());
$xmas = date_create_from_format('m-d', '12-25', wp_timezone());
$diff = date_diff($now, $xmas);
11/29の段階であと25日と表示されていました。おかしいな。
お試しコード追加
$now2 = date_create_from_format('m-d', '11-29', wp_timezone());
print $now->format(DATE_ATOM).':'.date_diff($now, $xmas)->format('%a').'<br>';
print $now2->format(DATE_ATOM).':'.date_diff($now2, $xmas)->format('%a').'<br>';
比較する日付:残り日数
を表示する。
nowは25日でnow2は26日...?
お試しコード変更、ミリ秒まで表示してみる
$now2 = date_create_from_format('m-d', '11-29', wp_timezone());
print $xmas->format(DATE_RFC3339_EXTENDED).'<br>';
print $now->format(DATE_RFC3339_EXTENDED).':'.date_diff($now, $xmas)->format('%a').'<br>';
print $now2->format(DATE_RFC3339_EXTENDED).':'.date_diff($now2, $xmas)->format('%a').'<br>';
date_create('now', wp_timezone());
はミリ秒まで生成されるが、date_create_from_format('m-d', '12-25', wp_timezone());
は秒までなため、比較に差が出ていた。
$now = date_time_set(date_create('now', wp_timezone()), 0, 0, 0, 0);
$xmas = date_time_set(date_create_from_format('m-d', '12-25', wp_timezone()), 0, 0, 0, 0);
$diff = date_diff($now, $xmas);
最終的に、時〜ミリ秒に0を設定し計算する形にしました。