【WordPress】Tips


WordPressを作成する際のTipsをメモ。
随時更新していく予定。

# 管理画面系
## 管理画面の特定ページにフック

- <a href="https://firegoby.jp/archives/2236" target="_blank">admin_headを特定のページでのみ使用するにはhook_suffixを知るべし</a>

まずは、ページ固有のhook_suffixを以下のコードで知る。

```functions.php
add_action("admin_head", 'suffix2console');
function suffix2console() {
    global $hook_suffix;
    if (is_user_logged_in()) {
        $str = "<script type=\"text/javascript\">console.log('%s')</script>";
        printf($str, $hook_suffix);
    }   
}
```

その後に`admin_head-`の後にhook_suffixを着けてフックする。

```functions.php
add_action("admin_head-.$hook, 'myFunc');
function myFunc(){
    処理
}
```

## ログイン時にダッシュボード以外にリダイレクト
```function.php
function redirect_dashiboard() {
  if (!current_user_can('administrator')) { //管理者ではない場合
    if ( '/wp-admin/index.php' == $_SERVER['SCRIPT_NAME'] ) {
      wp_redirect( admin_url( 'edit.php' ) );
    }
  }
}
add_action( 'admin_init', 'redirect_dashiboard' );
```

## お知らせを非表示にする
```function.php
function remove_menus () {
  if (!current_user_can('administrator')) { //管理者ではない場合
    //本体のアップデート通知を非表示
    add_filter('pre_site_transient_update_core', create_function('$a', "return  null;"));
    //テーマ更新通知を非表示
    remove_action( 'load-update-core.php', 'wp_update_themes' );
    add_filter( 'pre_site_transient_update_themes', create_function( '$a', "return null;" ) );
  }
}
add_action('admin_menu', 'remove_menus');
```

## .svgファイルをメディアにアップできるようにする
以下のコードをfunctions.phpに追加する。

- [[WordPress] .svg 拡張子画像をアップロードできるようにし、管理画面のアイキャッチ設定欄にサムネイルを表示されるようにする](http://memocarilog.info/wordpress/7404)

```functions.php
function cc_mime_types($mimes) {
  $mimes['svg'] = 'image/svg+xml';
  return $mimes;
}
add_filter('upload_mimes', 'cc_mime_types');
```

## 挿入する画像のパスからドメインを削除する
メディアを追加で追加された画像のパスは、デフォルトではドメインを含んでいるため、
ローカルで投稿すると __http://localhost:8888/... __ といったパスになってしまいます。
このまま本番側に移行すると、表示されませんし書き換えるのが面倒です。
下記の記述をfunctions.phpに追加すると、メディアを追加で追加された画像パスからドメインを取り除くことができます。「/wp-content/uploads/yyyy/MM/hoge.png」といった感じになります。

```functions.php
/**
 * メディアを追加で追加される画像パスからドメインを削除する
 * @param  [type] $url [description]
 * @return [type]      [description]
 */
function delete_host_from_attachment_url( $url ) {
    $regex = '/^http(s)?:\/\/[^\/\s]+(.*)$/';
    if ( preg_match( $regex, $url, $m ) ) {
        $url = $m[2];
    }
    return $url;
}
add_filter( 'wp_get_attachment_url', 'delete_host_from_attachment_url' );
```


# 表示系
## URLやサイト情報の取得
`get_bloginfo()`で大体取得できる
[テンプレートタグ/get bloginfo](https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/get_bloginfo)

## カスタム投稿の表示数を変更する
投稿とカスタム投稿の表示数を別々にしたい場合は、pre_get_postsをフックする。

```functions.php
// 一覧に表示する件数を16件に変更
add_action('pre_get_posts', 'my_pre_get_posts');
function my_pre_get_posts($query) {
    if (!is_admin() && $query->is_main_query() && is_post_type_archive('post_type')) {
        $query->set('posts_per_page', 16);
    }
}
```

## 投稿タイプの取得
```functions.php
$post_type = get_post_type();
```

## IDをまとめて返す関数
IDをいちいち取得するのが面倒なので、まとめて返す関数を作成しておくと便利。
下の例では、固定ページとカテゴリの第一階層のIDを配列で返却する。

```functions.php
/**
 * IDをまとめて返す関数
 * keyにスラッグ名を使用する
 * @return array
 */
function get_ID_lists() {
  $pages      = [];
  $categories = [];

  // 固定ページのIDを取得
  foreach(get_pages() as $val) {
    $pages[$val->post_name] = $val->ID;
  }

  // カテゴリのIDを取得 第一階層のみ
  foreach(get_categories() as $val) {
    $cate_path = get_category_by_slug($val->slug);
    if ($cate_path != '') {
      $categories[$val->slug] = get_category_by_slug($val->slug)->cat_ID;
    }
  }

  $arr = array(
    'page' => $pages,     // 固定ページ
    'cate' => $categories // カテゴリ
  );

  return $arr;
}
$get_ID_lists = get_ID_lists();
```

使い方は以下。

```index.php
global $get_ID_lists;

echo $get_ID_lists['page'][slug_name];
```

## 投稿数の取得
投稿数を取得するには、wp_count_postsを使う。
ページャーを作成する際などに便利。

```functions.php
$count = wp_count_posts($post_type)->publish;
```

## 現在のページ数と最大ページ数
```functions.php
global $wp_query;
// 現在のページ数
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;  
// 最大ページ数
$max_page = $wp_query->max_num_pages;  
```

### ページャー作成例
```functions.php
<!--10件以上で表示-->
<?php if(wp_count_posts('news')->publish > 10){ ?>

<!--ページャー-->
<div class="pager">
  <?php
    global $wp_query;
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;  
    $max_page = $wp_query->max_num_pages;  
  ?>
  <ul class="pager-navi">
    <?php if( $paged == 1 ){ ?>
    <li class="prev"><span class="text is-current">PREV</span></li>
    <?php }else{ ?>
    <li class="prev"><a href="<?php echo get_pagenum_link($paged-1); ?>" class="text">PREV</a></li>
    <?php } ?>

    <?php if( $paged == $max_page ){ ?>
    <li class="next"><span class="text is-current">NEXT</span></li>
    <?php }else{ ?>
    <li class="next"><a href="<?php echo get_pagenum_link($paged+1); ?>" class="text">NEXT</a></li>
    <?php } ?>
  </ul>
</div>

<?php } ?>

```

## 次/前の投稿情報を取得
```functions.php
$prev_post = get_previous_post();
$next_post = get_next_post();
```

### 次へ/前へリンク作成例
```functions.php
<!--1件以上で表示-->
<?php if(wp_count_posts('news')->publish > 1){ ?>

<!--ページャー-->
<div class="pager">
  <?php
    $prev_post = get_previous_post();
    $next_post = get_next_post();
  ?>
  <ul class="pager-navi">
    <?php if( $prev_post ){ ?>
    <li class="prev"><a href="post/<?php echo $prev_post->ID; ?>" class="text">PREV</a></li>
    <?php }else{ ?>
    <li class="prev"><span class="text is-current">PREV</span></li>
    <?php } ?>

    <?php if( $next_post ){ ?>
    <li class="next"><a href="/post/<?php echo $next_post->ID; ?>" class="text">NEXT</a></li>
    <?php }else{ ?>
    <li class="next"><span class="text is-current">NEXT</span></li>
    <?php } ?>
  </ul>
</div>

<?php } ?>
```