functions.phpをプラグイン化する

# はじめに
私の場合、新規でWordpressサイトを立ち上げるとなると、完全に自作のテーマを作ってしまうので、カスタマイズは`functions.php`に書いてしまします。
しかし、世の中そんな暇な人ばかりではない。大体の方が、標準テーマをベースにカスタマイズする方が多いと小耳にはさみました。
`標準テーマをカスタマイズ`と言う事は、更新が入ってしまった時にカスタマイズした箇所が消えてしまうリスクがあります。
まぁ、子テーマを作ってしまえば良いのですが、最初の段階では、途中までこっちのテーマベースにしたけど、やっぱりこっちのテーマの方が…なんてこともなり兼ねない（過去の私がそうでした汗）
であれば、テーマを行ったり来たりしても、基本のカスタマイズした部分はそのまま継承できるようにしたい。
そこで、テーマの種類に左右されない`プラグイン化`を行えば、簡単では？？となり今回記事にしました。

# プラグインとは
Wordpressの標準機能だけでは足りない機能を追加したり、不要な機能をOFFにしたりする【拡張機能】です。
テーマファイルが違くても、プラグインをONにすれば、その機能が有効化され、サイトに適用されます。
基本的な書き方を覚えれば、いつも行うカスタマイズが、プラグイン化することで簡単に適用できるので、おすすめです。

:::note info
**今回プラグイン化する`functions.php`はこちら**
[最初にやっておきたいfunctions.phpの基本設定](https://qiita.com/makkie/items/edbde858f5daa3522114)

過去記事で`functions.php`のカスタマイズを公開しています。
とりあえず`functions.php`のカスタマイズでええわ～って方はこちらをどうぞ。
:::

# プラグイン化する機能
### ログイン画面のカスタマイズ
+ ログイン画面の背景色の変更
+ ロゴマークの変更
### ダッシュボードのカスタマイズ
+ バージョン情報の非表示
+ お問い合わせ先のリンク修正
+ サイドバーの「コメント」は非表示
### カスタム機能をON
+ カスタムナビゲーション(自動で挿入されるタグを消す)
+ サムネイル（アイキャッチ）
### 投稿一覧、固定ページ一覧に機能を追加
+ スラッグ表示
+ アイキャッチ画像を表示

# プラグイン制作のルール
プラグインは、個人的に使うものから、Wordpressユーザーに広く使ってもらうために配布や販売しているものまで幅広くあります。
でもその中でルールがなかったら、エラーの原因になり、Webサイト自体が動かない！なんて最悪なことが起こる可能性もあります。
個人的に利用するのであっても、一緒に他のプラグインを入れる予定がある場合は、必ず守ってください。

https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90

### プラグインの名前
プラグインファイルを入れるフォルダを`/wp-content/plugin/`配下に作ります。

これはCodexにもありますが、他のプラグインと被らない様にしてください。
日本語は使えないので、日本語をアルファベット化してもいいですね。
```
/my-custom-plugin/
/my-plugin/
/kasutamaizu/
...
```
### プラグインファイルの名称
`my-custom-plugin`と言う名前のプラグインであれば`my-custom-plugin.php`ですね。
これも他と被らない名称が良いとされていますので、最初に作ったフォルダと同じ名称が良いかと思います。
```
/my-custom-plugin/my-custom-plugin.php
/my-plugin/my-plugin.php
/kasutamaizu/kasutamaizu.php
...
```
### readme.txtの先頭に記載
`readme.txt`の先頭には下記を記載してください。
```
=== Plugin Name(プラグインの名前) ===
Contributors: ※これは wordpress.org ユーザーID のリストである必要があります
Donate link: ※公式サイト
Tags: ※このプラグインが属しているタグ
Requires at least: ※対応しているWordpressのバージョン
Tested up to: ※テスト済みのWordpressのバージョン
Stable tag: ※プラグインのバージョン
Requires PHP: ※必要なPHPバージョン
License: ※ライセンス表記
License URI: ※ライセンスの記載されているURI
```
Codexには「Stable tagがあれば他はいらない」的なことあるけど、後学のために全文入れるのがいいかな。
公式のプラグインページで配布・販売する場合は、この他にも色々記載事項あるみたいですが、今回はそれは想定していないので割愛。
必要な人はCodexをご覧ください。

### プラグインファイルの先頭に情報記載
上記`readme.txt`の先頭に記載している内容をそのまま入れるか、下記の様式で追加。
```
Plugin Name: (プラグインの名前)
Plugin URI: (プラグインの説明と更新を示すページの URI)
Description: (プラグインの短い説明)
Version: (プラグインのバージョン番号。例: 1.0)
Author: (プラグイン作者の名前)
Author URI: (プラグイン作者の URI)
License: (ライセンス名の「スラッグ」 例: GPL2)
```
https://ja.wordpress.org/plugins/developers/

上記情報を記載したら、必ず下記コードを入れます。
```diff_php
if ( ! defined( 'ABSPATH' ) ) exit;
```
上記は、PHPファイルのURLに直接アクセスされても中身見られないようにするためのセキュリティコードです。

## functions.phpをプラグイン化
上述した情報にプラス、`functions.php`の内容をコピペします。
こんな感じ。
**`functions.php`の内容は必ず削除してください。**

```diff_php:my-custom-plugin.php
<?php
/*
Plugin Name: (プラグインの名前)
Plugin URI: (プラグインの説明と更新を示すページの URI)
Description: (プラグインの短い説明)
Version: (プラグインのバージョン番号。例: 1.0)
Author: (プラグイン作者の名前)
Author URI: (プラグイン作者の URI)
License: (ライセンス名の「スラッグ」 例: GPL2)
*/
if ( ! defined( 'ABSPATH' ) ) exit;

function custom_login_logo() {
  echo '<style type="text/css">';
  echo 'h1 a { background: url('.get_bloginfo('template_directory').'/images/logo.png) 100% 100% no-repeat !important; }';
  echo 'body.login { background: #ecf7f8; }';
  echo '</style>';
 }
add_action('login_head', 'custom_login_logo');

remove_action( 'wp_head', 'wp_generator');

function custom_admin_footer() {
   echo '<a href="***">お問い合わせ</a>';
}

add_action( 'admin_menu', 'remove_menus' );
function remove_menus(){
    //remove_menu_page( 'index.php' ); //ダッシュボード
    //remove_menu_page( 'edit.php' ); //投稿メニュー
    //remove_menu_page( 'upload.php' ); //メディア
    //remove_menu_page( 'edit.php?post_type=page' ); //ページ追加
    remove_menu_page( 'edit-comments.php' ); //コメントメニュー
    //remove_menu_page( 'themes.php' ); //外観メニュー
    //remove_menu_page( 'plugins.php' ); //プラグインメニュー
    //remove_menu_page( 'tools.php' ); //ツールメニュー
    //remove_menu_page( 'options-general.php' ); //設定メニュー
}

function register_my_menus() {
  register_nav_menus( array(
    'nav-head' => 'ヘッダーナビ',
    'nav-foot' => 'フッターナビ',
  ));
}
add_action( 'after_setup_theme', 'register_my_menus' );
add_filter('nav_menu_css_class', 'my_css_attributes_filter', 100, 1);
add_filter('nav_menu_item_id', 'my_css_attributes_filter', 100, 1);
add_filter('page_css_class', 'my_css_attributes_filter', 100, 1);
function my_css_attributes_filter($var) {
  return is_array($var) ? array_intersect($var, array('current-menu-item')) : '';
}

add_theme_support('post-thumbnails');

//スラッグ表示--------------------------------------------
function add_posts_column_title($colomun) {
  $colomun['slug'] = 'スラッグ';
  echo '<style>
  .fixed .column-slug {width: 15%;}
  </style>';
  return $colomun;
}
function add_posts_column($column_name, $post_id) {
  if($column_name == 'slug') {
    $post = get_post($post_id);
    $slug = $post -> post_name;
    echo esc_attr($slug);
  }
}
add_filter('manage_posts_columns', 'add_posts_column_title');
add_action('manage_posts_custom_column', 'add_posts_column', 10, 2);

//固定ページの投稿一覧に
function add_page_column_title($colomun) {
  $colomun['slug'] = 'スラッグ';
  echo '<style>
  .fixed .column-slug {width: 15%;}
  </style>';
  return $colomun;
}
function add_page_column($column_name, $post_id) {
  if($column_name == 'slug') {
    $post = get_post($post_id);
    $slug = $post -> post_name;
    echo esc_attr($slug);
  }
}
add_filter('manage_pages_columns', 'add_page_column_title');
add_action('manage_pages_custom_column', 'add_page_column', 10, 2);

//アイキャッチ画像表示
//各投稿一覧ページにアイキャッチ画像用の列を追加
add_filter( 'manage_posts_columns', 'add_custom_post_columns');    //投稿 & カスタム投稿
add_filter( 'manage_pages_columns', 'add_custom_post_columns' );   //固定ページ
if ( !function_exists( 'add_custom_post_columns' ) ) {
    function add_custom_post_columns( $columns ) {
        global $post_type;
        if( in_array( $post_type, array('post', 'page', 'blog') ) ) { //列を追加するタイプをここで指定
            $columns['thumbnail'] = 'アイキャッチ画像';    //カラム表示名
        }
        return $columns;
    }
}
//サムネイル画像を表示
add_action( 'manage_posts_custom_column', 'output_custom_post_columns', 10, 2 );  //投稿 & カスタム投稿(階層構造が無効)
add_action( 'manage_pages_custom_column', 'output_custom_post_columns', 10, 2 );  //固定ページ & カスタム投稿(階層構造が有効)
if ( !function_exists( 'output_custom_post_columns' ) ) {
    function output_custom_post_columns( $column_name, $post_id ) {
        if ( 'thumbnail' === $column_name ) {
            $thumb_id  = get_post_thumbnail_id( $post_id );
            if ( $thumb_id ) {
                $thumb_img = wp_get_attachment_image_src( $thumb_id, 'medium' );  //サイズはご自由に
                echo '<img src="',$thumb_img[0],'" width="160px">';
            } else {
                echo 'アイキャッチ画像が<br>設定されていません';
            }
        }
    }
}
?>
```
ファイル構造としてはこんな感じになります。
```
../wp-content/plugin/my-custom-plugin/
        ├─my-custom-plugin.php
        └─readme.txt
```
細かいコードの解説はこちらで確認してください。

https://qiita.com/makkie/items/edbde858f5daa3522114

## プラグインの有効化
FTPソフトでフォルダごとPluginフォルダに配置して、プラグインページで有効化するか、フォルダをzip圧縮して、アップロードして有効化すれば拡張機能が有効になっているはずです。

当該プラグインを有効化してエラーメッセージが出る場合は、`functions.php`に記載している内容との競合、もしくは他プラグインとの競合が考えられますので、エラーメッセージに従って調整しましょう。

:::note warn
エラーメッセージが表示される様にするには、`wp-config.php`内の`define( 'WP_DEBUG', false );`となっている個所を`define( 'WP_DEBUG', true );`にして下さい。
**本番環境では、`false`に戻すのを忘れずに。**
:::

# まとめ
以上簡単に出来るfunctions.phpをプラグイン化する方法でした。
これでテーマが更新されても安心ですね。

10年以上WPでWEBサイト制作をしていますが、独学のため、色々間違えている個所などありましたらご指摘いただけますと幸いです。


:::note info
**こちらを参考にさせていただきました。ありがとうございます。**
[functions.phpにカスタマイズした内容を、プラグイン化してみよう！（WordPressプラグインを自作してみよう）](https://tecchan.jp/entry/210320-plugin/)
:::