WordPress Tips(執筆中)

# 管理画面
## 関連リンク
[プラグイン API/アクションフック一覧](https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7)
[Dashicon一覧](https://developer.wordpress.org/resource/dashicons/#menu) - メニューに設定可能なアイコンの一覧。
## ログイン直後にダッシュボード以外に遷移
```php:function.php
add_action('admin_init', 'custom_index');
function custom_index() {
    // global $current_user; // 管理ユーザはダッシュボードを表示する場合はコメントイン
    // if ($current_user->roles[0] != 'administrator') {
    if ('/wp-admin/index.php' == $_SERVER['SCRIPT_NAME']) {
        wp_redirect(admin_url('profile.php')); // プロフィールにリダイレクト
    }
    // }
}
```
## ダッシュボードから要らんウィジェット削って独自ウィジェットを嵌め込む
```php:function.php
function custom_dashboard() { // ウィジェット非表示
    if (!current_user_can('level_10')) { // 管理者以外は非表示
        global $wp_meta_boxes;
        unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_right_now']); // 現在の状況
        unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_recent_comments']); // 最近のコメント
        unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_incoming_links']); // 被リンク
        unset($wp_meta_boxes['dashboard']['normal']['core']['dashboard_plugins']); // プラグイン
        unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_quick_press']); // クイック投稿
        unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_recent_drafts']); // 最近の下書き
        unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_primary']); // WordPressブログ
        unset($wp_meta_boxes['dashboard']['side']['core']['dashboard_secondary']); // WordPressフォーラム
    }
    wp_add_dashboard_widget('add_widget01', '追加ウィジェット01', 'my_widget01');
}
function my_widget01() {
    echo 'Do Anything Here.';
}
add_action('wp_dashboard_setup', 'custom_dashboard');
```
## 記事が投稿されたらメールを送る(ステータスが変更された時限定)(確認中)
```php:function.php
/**
 * $new_stat 変更後ステータス
 * $old_stat 変更前ステータス
 * $post Postオブジェクト
 */
function my_notice_mail($new_stat, $old_stat, $post)
{
    if ('publish' == $new_stat && 'publish' != $old_stat // 公開以外→公開
     && 'post' == $post->post_type) { // 投稿タイプが post カスタム投稿なら適宜修正
        $header = ['From: from@example.com'];
        wp_mail(
            'to@example.com', // 宛先
            $post->post_title, // タイトル
            get_permalink($post->ID), // 本文
            $header // オプションヘッダ
        );
    }
}
add_action('transition_post_status', 'my_notice_mail', 10, 3);
```
## 記事が投稿されたらメールを送る(常時)(確認中)
```php:function.php
/**
 * $post_id 投稿ID
 * $post_after 変更後データ
 * $post_before 変更前データ
 */
function my_notice_mail($post_id, $post_after, $post_before)
{
    if ('post' == $post_after->post_type) { // 投稿タイプが post
        $author = get_userdata($post_after->post_author);
        wp_mail(
            $author->user_email, // 宛先
            $post_after->post_title, // タイトル
            get_permalink($post_after->ID) // 本文
        );
    );
}
add_action('post_updated', 'my_notice_mail');
```
参考: [WP関数『wp_insert_post』に含まれるアクションフック5つ](http://www.sandalot.com/wp%E9%96%A2%E6%95%B0%E3%80%8Ewp_insert_post%E3%80%8F%E3%81%AB%E5%90%AB%E3%81%BE%E3%82%8C%E3%82%8B%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%83%E3%82%AF5%E3%81%A4/)
プロフィールの更新時のフックは profile_update

```php:function.php
add_action('profile_update', 'my_profile_update', 10, 2);
function my_profile_update($user_id, $old_user_data) {
   // Do something
}
```
## 色々非表示
```php:function.php
// 管理画面系 ////////////////////////////////////////////////////////////////////////////////
add_filter('pre_site_transient_update_core', '__return_zero'); // バージョン更新を非表示
remove_action('wp_version_check', 'wp_version_check'); // APIによるバージョンチェックの通信をさせない
remove_action('admin_init', '_maybe_update_core');

function remove_admin_bar_menu($wp_admin_bar) { // 管理バーの項目を非表示
    $wp_admin_bar->remove_menu('wp-logo'); // WordPressアイコン
    $wp_admin_bar->remove_menu('my-account'); // こんにちは、XXXさん!
}
add_action('admin_bar_menu', 'remove_admin_bar_menu', 70);

function my_admin_head() { // 管理バーのヘルプメニューを非表示
   echo '<style type="text/css">#contextual-help-link-wrap{display:none;}</style>';
}
add_action('admin_head', 'my_admin_head');

add_filter('admin_footer_text', 'custom_admin_footer_text'); //「WordPress のご利用ありがとうございます。」非表示
function custom_admin_footer_text() {
    // echo '表示内容を変更するならメッセージを記述する。';
}

function remove_footer_version() { // バージョン非表示
    remove_filter('update_footer', 'core_update_footer');
}
add_action('admin_menu', 'remove_footer_version');

// プロフィール系 ///////////////////////////////////////////////////////////////////////////////
remove_action('admin_color_scheme_picker', 'admin_color_scheme_picker'); // 管理画面の配色 非表示

function profile_js() { // プロフィール欄の不要項目を非表示
    echo <<< EOT
<script type="text/javascript">
    tftn = "table.form-table:nth-of-type";
    jQuery(document).ready(function() {
        jQuery("div#profile-page h3").css("display", "none");
        jQuery(tftn + "(1)").css("display", "none");
        jQuery(tftn + "(2) tr:nth-child(2)").css("display", "none");
        jQuery(tftn + "(2) tr:nth-child(3)").css("display", "none");
        jQuery(tftn + "(2) tr:nth-child(4)").css("display", "none");
        jQuery(tftn + "(2) tr:nth-child(5)").css("display", "none");
        jQuery(tftn + "(3) tr:nth-child(2)").css("display", "none");
        jQuery(tftn + "(4) tr:nth-child(1)").css("display", "none");
    });
</script>
EOT;
}
add_action('show_user_profile', 'profile_js'); // ユーザーのプロフィール
add_action('edit_user_profile', 'profile_js'); // ユーザー一覧からユーザ編集

// 投稿系 ////////////////////////////////////////////////////////////////////////////
add_filter('get_sample_permalink_html', '__return_false'); // パーマリンク、編集 非表示
add_filter('get_shortlink', '__return_false'); // 短縮URLを取得非表示
function show_owned_posts_only($views) {
    unset($views['all']); // すべて非表示
    unset($views['draft']); // 下書き非表示
    unset($views['publish']); // 公開済み非表示
    unset($views['pending']); // 保留中非表示
    unset($views['trash']); // ゴミ箱非表示
    return $views;
}
add_filter('views_edit-post', 'show_owned_posts_only'); // カスタム投稿はpost部分をカスタム投稿のスラッグに変更
// 投稿一覧系 ////////////////////////////////////////////////////////////////////////
// クイック編集を非表示
add_filter('post_row_actions', 'hide_quickedit');
add_filter('page_row_actions', 'hide_quickedit');
function hide_quickedit($actions) {
    unset($actions['inline hide-if-no-js']);
    return $actions;
}
```
## プロフィールの不要項目削除
```php:function.php
function my_user_meta($x)
{
    //不要な項目の削除
    unset($x['aim']);
    unset($x['jabber']);
    unset($x['yim']);
    unset($x['first_name']);
    unset($x['last_name']);
    unset($x['display_name']);
 
    //項目の追加
    $x['company_name'] = '会社名';
    $x['company_name_kana'] = '会社名フリガナ';
    $x['user_sex'] = '性別';
    return $x;
}
add_filter('user_contactmethods', 'my_user_meta', 10, 1);
```
## 他のメンバーの画像を見れないようにする
View Own Posts Media Only か WP Users Media プラグインを使う。
WP Users Media を使ったら権限毎に見れる見れないが設定できた。
## 管理画面にスタイル適用
### 管理者以外のユーザに独自のCSSを読込む
```php:function.php
//管理者以外のユーザに独自のcssを読み込む
if (!current_user_can('administrator')) {
    function wp_custom_admin_css() {
        echo "\n" . '<link rel="stylesheet" type="text/css" href="' .get_bloginfo('template_directory'). '/css/custom-admin-css.css' . '" />' . "\n";
    }
    add_action('admin_head', 'wp_custom_admin_css', 100);
}
```
```css:custom-admin-css.css
/* アドミンメニュー非表示 */
#adminmenuback,
#adminmenu,
#contextual-help-link-wrap,
#screen-options-link-wrap {
    display:none;
}
#wpcontent {
    margin-left:0;
    clear:both;
}
```
[管理者以外のユーザに独自のcssを読み込む](http://webimemo.com/wordpress/1597#link5)
### WordPressの管理画面をカスタマイズする時に使えるハック
[Part 1](https://www.nxworld.net/wordpress/wp-admin-customize-hack.html)
[Part 2](https://www.nxworld.net/wordpress/wp-admin-customize-hack2.html)
[Part 3](https://www.nxworld.net/wordpress/wp-admin-customize-hack3.html)
# WordPress 全般
## php からショートコードを実行する。
```php:php
    echo do_shortcode('[shortcode params=params]');
```
## カスタム投稿
### 追加
```php:function.php
add_action('init', 'create_post_type');
function create_post_type() {
    register_post_type(
        'news', // 投稿タイプ名(スラッグ)
        array(
            'labels' => array(
                 'name' => __('新着情報'), // 投稿タイプ名(複数)
                 'singular_name' => __('新着情報'), // (単数)
            ),
            // 'label' => __('新着情報'), // 複数形がなければこれでもOK
            'public' => true, // 管理画面に表示
            'has_archive' => true // アーカイブページをアクセス可能にする。
            'menu_position' => 5, // 5:投稿の下, 10:メディアの下, 20:固定ページの下
            // 'exclude_from_search' => true, // 検索結果に含まないようにするには true を設定
            // 'hierarchical' => true, // 親記事を指定する場合は true 通常は省略
            // 'supports' => array( // 省略時の初期値は 'title', 'editor',
            //     'title', // タイトル
            //     'editor', // 本文のエディタ
            //     'author', // 作成者
            //     'thumbnail', // アイキャッチ画像
            //     'excerpt', // 抜粋
            //     'trackbacks', // トラックバック送信
            //     'custom-fields', // カスタムフィールド
            //     'comments', // ディスカッション
            //     'revisions', // リビジョン
            //     'page-attributes', // 属性（親・順序）
            // ),
        )
    );
}
```
※ ちなみにこれで作ると Types で認識してくれないので注意。
Types 側で エクスポート/インポートはできるけど・・・。方法求む。
### 投稿の下にカスタム投稿タイプを5個以上追加するとメディアの下に回る対策(どうやらうまく動かない)
実行順番が問題？

投稿が \$menu[5]、メディアが \$menu[10]、固定ページが \$menu[20] に設定されている。メディアを \$menu[19] にコピーして、\$menu[10] をクリアすることで、5～18 までカスタム投稿タイプを設定できる。

```php:function.php
function customize_menus(){
   global $menu;
   $menu[19] = $menu[10];  //メディアの移動
   unset($menu[10]);
}
add_action('admin_menu', 'customize_menus');
```
### カスタム投稿限定検索フォーム
```php:
<form method="get" id="testSearch" action="<?php echo home_url('/'); ?>">
  <input type="text" name="s" id="testSearchInput" value="<?php the_search_query(); ?>" placeholder="カスタム投稿タイプ別検索" />
  <input type="hidden" name="post_type" value="test">
  <input type="submit" value="search" accesskey="f" />
</form>
```
## カスタム投稿一覧にフィールドを追加する。
[プラグインAPI /フィルタリファレンス/ $ post type posts columnsを管理する](https://codex.wordpress.org/Plugin_API/Filter_Reference/manage_%24post_type_posts_columns)
特定のフィールドを置き換えるなら

```php:function.php
// カスタム投稿タイプ book の投稿一覧で 追加した著者名のカラムでその投稿のカスタムフィールド book_author_name を表示
add_action('manage_book_posts_custom_column', 'custom_book_column', 10, 2);
function custom_book_column($column, $post_id) {
    switch ($column) {
        case 'book_author' : 
            echo get_post_meta($post_id, 'book_author_name', true); 
            break;
    }
}
```
## 登録通知メール等の内容を変更する
Theme My Loginプラグインを使用する。☑ Custom E-mailを有効にする。
後は設定画面からメールの内容を修正する。
# テーマ
カスタマイズしやすいテーマ [bones](https://themble.com/bones/)
# プラグイン
## Toolset
### いろいろ部品を隠す投稿画面の Types ボタンを隠す
```php:function.php
add_action('admin_print_styles', 'hide_buttons', 100);
function hide_buttons() {
?>
<style type="text/css">
.wp-media-buttons .wpv-shortcode-post-icon { display:none } /* 投稿画面の Typesボタンを隠す */
.types-table-in-meta-box { display:none } /* フロントエンドディスプレイを隠す */
</style>
<?php
}
```
### 親投稿のIDを取得する。
Post繋がりの情報はメタ情報に保持されているので、以下で取得する。

```php:function.php
$parentId = get_post_meta($id, "_wpcf_belongs_親投稿のスラグ_id, true);
```
# ユーザ名で使用可能な文字
半角英数、-(ハイフン)、_(アンダーバー)、@

# nginx
## wp super cache 設定
/etc/nginx/conf.d/default.conf に [Nginx](https://wpdocs.osdn.jp/Nginx) の WP Super Cacheのルールを追記する。

# 面白そうなプラグイン
CubePoints 投稿にポイントを付与する。
Events Manager 場所やイベント登録して予約などもできるイベント管理
Barcode Reception バーコードで受付処理を実施する。

[WordPressデータベース構造](http://wpdocs.osdn.jp/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%A7%8B%E9%80%A0)
[WordPressを100倍速くする！ MySQLの調整やnginx proxy cache](http://kray.jp/blog/wordpress-tuning/)
[初心者向けWordPress DB ＆ Performance](https://www.slideshare.net/miyauchi/wordpress-db-performance)