WordPressプラグイン開発超入門:カテゴリー一括作成機能を作ってみよう

2017/09/07

Vishnu Ajit

44

Articles in this issue reproduced from SitePoint
Copyright © 2017, All rights reserved. SitePoint Pty Ltd. www.sitepoint.com. Translation copyright © 2017, KADOKAWA CorporationJapanese syndication rights arranged with SitePoint Pty Ltd, Collingwood, Victoria,Australia through Tuttle-Mori Agency, Inc., Tokyo

WordPressの魅力といえば、便利なプラグインが揃っていること。でも、必要な機能だけを自分でプラグインとして作ることもできます。カテゴリーをまとめて追加するシンプルなプラグインの作り方を紹介します。

WordPressでWebサイトやブログを作るときにはカテゴリーを作成しますが、複数のカテゴリーを1つずつ作るのは面倒です。そこで、カンマで区切られた複数のカテゴリー名を1回のボタン操作でWordPressに登録するプラグインを作ります。

必要なもの

  1. ローカル(あるいは開発用サーバー)にWordPressがインストールされた環境
  2. 基本的なHTMLとPHPの知識

作成するプラグイン(完成品のプレビュー)

Bulk Category Creator

WordPressプラグインについて

WordPressのプラグインは基本的に、既存のWordPressを変更したり新機能を追加したりするPHPのスクリプトです。Hello Dollyプラグインをはじめ単純なものや、JetpackやGoogle Analyticsプラグインなどの非常に高度なものまであります。

なぜプラグインを作るのでしょう?

WordPressを使っている開発者の多くが気付いているように、WordPressのコアファイルの改変は、WordPressの更新時に問題が発生したり、セキュリティの問題が生じたりするので避けるべきです。WordPressのコアを改変せずに、WordPressのサイトに新機能を追加する方法が「プラグイン」です。プラグインの開発を学ぶことで、WordPressの仕組みをさらに理解でき、WordPress開発者としての腕も向上します。

プラグインの開発を学ぶ

プラグインのフォルダー構造は決まっています。すべてのプラグインは、フォルダーに1つないし複数のPHPファイルを持ちます。

WordPressのフォルダーに、wp-contentがあり、その中に、pluginsフォルダーがあります。

フォルダー構造は以下の通りです。

File Structure

はじめに:ファイルの作成

プラグイン製作の最初のステップはファイルの作成です。WordPressのwp-contentフォルダーにあるpluginsフォルダーを開きます。pluginsフォルダー内に新規フォルダー「bulk-category-creator」を作成します。

作成したフォルダー内に新規ファイル「bulk-category-creator.php」を作成します。フォルダー名とこのPHPファイルの名前を合わせます。

テキストエディターを開いて以下のコードを貼り付けてください。

<?php
   /*
   Plugin Name: Bulk Category Creator
   Plugin URI: http://www.ruforaweb.com
   Description: A plugin to bulk-create categories in one go
   Version: 1.0
   Author: Vishnu Ajit
   Author URI: http://twitter.com/vishnuajith310
   License: GPL2
   */

プラグインのメインファイルのヘッダー部分にコメント記述でプラグインの説明、バージョン情報、製作者の情報、ライセンス情報を表記します。今回のサンプルではbulk-category-creator.phpファイルに書きます。

以下はプラグインのメタデータです。1行ずつ解説します。

  • Plugin Name:プラグインの名称を書きます。今回はBulk Category Creator(カテゴリー一括作成)とします
  • Plugin URI:プラグインがダウンロード可能な場所へのリンクです。WordPress.orgのアーカイブもしくは別の場所になります
  • Description:プラグインがなにをするツールか、説明を記述します
  • Version:プラグインのバージョンを記述します
  • Author:そのプラグインの著作権者や開発者の情報を記述します
  • Author URI:開発者のインターネットアドレスへのリンクを書きます
  • License:プラグインに関するライセンス情報を書きます

WordPressのダッシュボードからPlugins > Installed Pluginsへ移動すると、プラグインリストに先程作ったプラグインが表示されます。

コードの概要:カテゴリー一括作成プラグイン

コードを書き始める前に、WordPressのフックの基本を理解しましょう。

WordPressにはアクションフックとフィルターフック、大きく2種類のフックがあります。本記事はプラグイン開発の基本なので深入りはしませんが、2つの違いは以下の点です。

  • アクションフック:イベントが発生したときになにかをする場合に使います。たとえば、新しい記事が投稿されたらツイートする、などです
  • フィルターフック:データの加工や抽出が必要なときに使います

基本が分かったところで、プラグインのコードを書きます。

add_action('admin_menu', 'rfr_CategoryCreatorMenu');

上記のコードは関数rfr_CategoryCreatorMenuadmin_menuをフックします。

admin_menu関数は、WordPressの管理者ダッシュボードにサブメニューやメニューオプションを追加します。次に、以下のコードを書きます。

<?php
   /*
   Plugin Name: Bulk Category Creator
   Plugin URI: http://www.ruforaweb.com
   Description: A plugin to bulk-create categories in one go
   Version: 1.0
   Author: Vishnu Ajit
   Author URI: http://twitter.com/vishnuajith310
   License: GPL2
   */

add_action('admin_menu', 'rfr_CategoryCreatorMenu');

function rfr_CategoryCreatorMenu()
{

    add_menu_page('Bulk Category Creator Plugin','Bulk Category Creator','administrator', __FILE__, 'rfr_CategorySettingsPage' , 'dashicons-admin-plugins');

    add_action('admin_init', 'rfr_RegisterPluginSettings');

}

上記のコードを見ると、rfr_CategoryCreatorMenu関数を加えています。1行ずつ解説します。

接頭辞(プレフィックス)「rfr_」が付いています。WordPressのカスタムプラグインは、常に関数名を一意にして、重複しないようにします。きれいなコードになり、別のプラグインが同じ関数名を使用して衝突するのを防ぎます。そのため、関数には独自の接頭辞を付けます。今回はrfr_としましたが、自分の名前や会社名の先頭3文字など好きな接頭辞でかまいません。

関数rfr_CategoryCreatorMenuで、関数add_menu_pageを追加しています。

add_menu_page関数は一番上の階層のメニューページを追加します。この関数にはいくつものパラメーターが渡されます。

  • 第1引数:プラグインページのタイトルの中身
  • 第2引数:ダッシュボードに表示されるプラグインの名前。今回はBulk Category Creator
  • 第3引数:プラグインの権限と制限。今回は管理者のみがプラグインにアクセス・使用が可能
  • 第4引数:メニューを参照する際のスラッグ
  • 第5引数:ページを表示するために実行される関数
  • 第6引数:ダッシュボードに、メニューとともに表示されるアイコンのURL。今回はWordPressに用意されているアイコンセット「dashicons-admin-plugin」を使用。WordPressに標準で用意されるアイコンをさらに見るにはhttps://developer.wordpress.org/resource/dashiconsを参照

ダッシュボードを見ると、新しいメニュー「Bulk Category Creator」が表示されます。

admin_initアクションに別のフックを追加します。

add_action(‘admin_init’, ‘rfr_RegisterPluginSettings’);

後ほど戻って作業をします。

管理者ダッシュボードの外観をデザインします。すでに気が付いたかもしれませんが、add_menu_page関数からrfr_CategorySettingsPage関数を呼んでいます。

この関数を定義します。

function rfr_CategorySettingsPage() {
?>
<div class="wrap">
<h1>Bulk Category Creator</h1>

<form method='post'><input type='hidden' name='form-name' value='form 1' />
    <?php settings_fields( 'rfr-bulk-category-creator-group' ); ?>
    <?php do_settings_sections( 'rfr-bulk-category-creator-group' ); ?>
    <table class="form-table">
        <tr valign="top">
        <th scope="row">Enter categories separated by commas</th>
        <td>
        <textarea cols="50" rows="8" name="options_textarea"></textarea>
        </td>
        </tr>
    </table>

    <?php submit_button('Bulk Create Categories'); ?>

</form>

<?php } ?><

この部分に、プラグインの管理者ページの外観を定義します。

ざっくり言えば文字を入力するフォームを設置します。カンマ区切りで書かれたカテゴリー名を書きこむ入力欄です。

通常のHTMLでフォームを定義して、テーブルレイアウトの中に入力欄を設けます。フォームの宣言の下にsettings_fieldsdo_settings_sectionsを記述します。

「Bulk Category Creator」メニューを開くと以下のようになります。

ダッシュボードにHTMLのフォーム要素を追加できました。プラグインの操作画面は完成です。

残る作業は、カテゴリーを一括追加するためのプログラムです。

function rfr_RegisterPluginSettings() {
    //register our settings

    register_setting( 'rfr-bulk-category-creator-group', 'options_textarea' );

    rfr_CreateCategories();

}

function rfr_CreateCategories()
{

    $returnedStr = esc_attr($_POST['options_textarea'] );

    $trimmed = trim($returnedStr);

    $categories_array = explode(',',$trimmed);

    foreach ($categories_array as $key => $value)
    {

        $catString = $value.'';

        $term = term_exists($value,'category');
        if($term==0 || $term==null)
        {
            create_category($value);

        }

    }

}

function create_category($value)
{
    $trimmedValue = trim($value);
    $hyphenatedValue = str_replace(" ", "-", $trimmedValue);

    wp_insert_term(
        $trimmedValue,
        'category',
        array(
            'description' => $trimmedValue,
            'slug'=> $hyphenatedValue
            )
        );
}

上記PHPの詳細を解説します。

$returnedStr = esc_attr($_POST['options_textarea'] );

$trimmed = trim($returnedStr);

$categories_array = explode(',',$trimmed);

$returnedStrには、フォーム要素のテキスト入力欄に入力された値が入ります。

$trimmedには、入力された文字列の左右の余計な空白を削除した値が入ります。

PHPのexplode関数は、カンマ区切りで表される値を、$categories_array変数(配列)に変換します。

次にforeachのループで、$categories_array変数の中身にアクセスします。

foreach ($categories_array as $key => $value)
{
    $catString = $value.'';

    $term = term_exists($value,'category');
    if($term==0 || $term==null)
    {
        create_category($value);

    }
}

このループで$categories_array配列内にある各値を取り出します。

$catStringには$valueの値が入ります。接頭辞の.' 'は、値を文字列型にするために付けます。

次の行は、$term = term_exists($value, ‘category’);です。

WordPressフックterm_existsにより、存在するカテゴリー名はリストに再度追加されません。たとえばカテゴリー「tall」がすでにあれば、この一括追加ツールで新たに「tall」を加えてもカテゴリーリストには追加されません。

次の行の条件式if($term ==0 || $term == null)で、すでに存在するカテゴリー名か確認します。

次に、create_categor関数に値を渡します。

function create_category($value)
{
    $trimmedValue = trim($value);
    $hyphenatedValue = str_replace(" ", "-", $trimmedValue);

    wp_insert_term(
        $trimmedValue,
        'category',
        array(
            'description' => $trimmedValue,
            'slug'=> $hyphenatedValue
            )
        );

}

この関数では以下の処理をします。

$trimmedValue = trim($value);

PHPのtrim関数に$valueを渡して、空白を取り除きます。

また以下のコードで、スラッグで使うためのハイフンでつないだ(hyphenated)値を生成します。

$hyphenatedValue = str_replace(" ", "-", $trimmedValue);

PHPのstr_replace関数で、文字列中のスペースをハイフンに変えます。たとえば追加するカテゴリー名が「Must Watch」なら、$hyphenatedValueは「Must-Watch」になります。

もうひとつのWordPressフックwp_insert_termで、空白を除去した値、分類、説明や上記のハイフン表記のスラッグなどを入れた配列を追加します。

関数wp_insert_termは3つのパラメーターを取ります。

  1. 第1引数:実際に追加される値(文字列)
  2. 第2引数:必要な分類(taxonomy)。ここでは「category」
  3. 第3引数:説明やスラッグが入った配列

完全なコードは以下の通りです。

< ?php
   /*
   Plugin Name: Bulk Category Creator
   Plugin URI: http://www.ruforaweb.com
   Description: A plugin to bulk-create categories in one go
   Version: 1.0
   Author: Vishnu Ajit
   Author URI: http://twitter.com/vishnuajith310
   License: GPL2
   */

add_action('admin_menu', 'rfr_CategoryCreatorMenu');

function rfr_CategoryCreatorMenu()
{

    add_menu_page('Bulk Category Creator Plugin','Bulk Category Creator','administrator', __FILE__, 'rfr_CategorySettingsPage' , 'dashicons-admin-plugins');

    add_action('admin_init', 'rfr_RegisterPluginSettings');

}

function rfr_RegisterPluginSettings() {
    //register our settings

    register_setting( 'rfr-bulk-category-creator-group', 'options_textarea' );

    rfr_CreateCategories();

}

function rfr_CreateCategories()
{

        $returnedStr = esc_attr($_POST['options_textarea'] );

        $trimmed = trim($returnedStr);

        $categories_array = explode(',',$trimmed);

    foreach ($categories_array as $key => $value)
    {

        $catString = $value.'';

        $term = term_exists($value,'category');
        if($term==0 || $term==null)
        {
            create_category($value);

        }

    }

}

function create_category($value)
{
    $trimmedValue = trim($value);
    $hyphenatedValue = str_replace(" ", "-", $trimmedValue);

    wp_insert_term(
        $trimmedValue,
        'category',
        array(
            'description' => $trimmedValue,
            'slug'=> $hyphenatedValue
            )
        );

}

function rfr_CategorySettingsPage() {
?>
<div class="wrap">
<h1>Bulk Category Creator</h1>

<form method='post'><input type='hidden' name='form-name' value='form 2' />
    < ?php settings_fields( 'rfr-bulk-category-creator-group' ); ?>
    < ?php do_settings_sections( 'rfr-bulk-category-creator-group' ); ?>
    <table class="form-table">

        <tr valign="top">
        <th scope="row">Enter categories separated by commas</th>
        <td>
        <textarea cols="50" rows="8" name="options_textarea"></textarea>
        </td>
        </tr>
    </table>

    < ?php submit_button('Bulk Create Categories'); ?>

</form>
</div>
< ?php } ?>

管理者ダッシュボードのBulk Categories Creatorへ移動し、カテゴリーをいくつか入力します。

この例ではTall、Medium、Short、Ultra Shortを、カンマ区切りで入力欄に記入します。

Bulk Create Categories

Bulk Create Categories(カテゴリーの一括作成)ボタンをクリックし、ダッシュボードのPosts > Categoriesへ移動すると、先ほど入力したカテゴリーがカテゴリーリストに表示されます。

Categories List

完成です。カテゴリー「ultra short」のスラッグを見るとハイフン区切りの「ultra-short」になっている点も確認してください。

本チュートリアルではじめてのWordPressプラグイン「カテゴリー一括作成ツール」が完成しました。解説通りに作業を進めた読者の手元には、実際に動作するWordPressプラグインがあります。

プラグインフォルダーをzip形式に圧縮すればプラグインを友人に配布できます。

(原文:Learn Plugin Development with a Bulk Category Creator

[翻訳:西尾 健史/編集:Livit

Copyright © 2017, Vishnu Ajit All Rights Reserved.

Vishnu Ajit

Vishnu Ajit

インド・Kerara州のWebデザイン・デジタルマーケティング企業Rufora Web Technologies社の創業者です。チームメンバーもハードワーカー揃いで、スゴいWordPressサイトを作るため日夜奮闘しています。Twitterアカウント@ruforawebをフォローしてください。WordPress開発ブログの更新情報を配信しています。

Loading...