functions.phpに書いている便利なコード

WorpdressやPHPに結構慣れてきたり、検索能力が上がってきたので、コードを書く時にほぼ困らなくなってきました。
テーマファイルの中でよく書き換えるのはfunctions.phpで、これにはプラグインにしなくてもいいけど便利なコードをよく書いています。

スポンサーリンク

ここでは現在、メインサイトやサブサイトのfunctions.phpに書いている便利だったり役に立つコードを紹介したいと思います。
ちょっと多めです・・・。

ファビコンを追加する

これはテーマのヘッダに書いてもいいんですが、なんとなくfunctions.phpに書いているコードです。

function admin_favicon() {
  echo '<link href="'.get_bloginfo('template_url').'/images/favicon.ico" rel="icon" type="image/x-icon" />'."\n";
}
add_action('admin_head', 'admin_favicon');

管理画面にもファビコンを追加する

管理画面にもファビコンがないと寂しいのでWordPressでWebページを作る時は絶対に書くようにしているコードです。

function admin_favicon() {
  echo '<link href="'.get_bloginfo('template_url').'/images/favicon.ico" rel="icon" type="image/x-icon" />'."\n";
}
add_action('admin_head', 'admin_favicon');

管理画面用のCSSを追加する

管理画面用のCSSって何を書くんだって思う方もいるかもしれませんが、私はビジュアルエディタとコードを編集するテキストエリアのサイズを変更して大きくしています。
初期だと小さくてなんか不便なんですよね・・・
まぁそれしか書いていません。

function admin_css() {
  echo '<link rel="stylesheet" type="text/css" href="'.get_bloginfo("template_directory").'/library/admin/admin.css">';
}
add_action('admin_head', 'admin_css');

ビジュアルエディタ用のCSSを追加する

これは実際の記事と編集中の記事のスタイルを合わせるためのコードです。
幅とかも変えてあげると、どれくらいで折り返されるのかわかるので結構便利ですよ。

add_editor_style('editor-style.css');
function mytheme_mce_settings( $initArray ) {
  $initArray['body_class'] = 'post';
  return $initArray;
}
add_filter( 'tiny_mce_before_init', 'mytheme_mce_settings' );

ビジュアルエディタでh1やh2などを除外する

h1タグとh2タグはブログタイトルや記事タイトルで使っているので必要ないですよね。
使わないのなら消しちゃいましょう。
ちなみに、それ以外を消したり残したいと思えば’p,pre,code,h3,h4,h5’となってるところにタグを書けば残りますし、書かなければ除外されます。

function custom_editor_settings( $initArray ) {
  $initArray['theme_advanced_blockformats'] = 'p,pre,code,h3,h4,h5';
  return $initArray;
}
add_filter( 'tiny_mce_before_init', 'custom_editor_settings' );

「続きを読む」のリンクについてくる「#more-$id」を削除する

デフォルトで「続きを読む」をクリックするとパーマリンクに#more-$idがついて途中から表示されます。
しかし、記事の最初から表示させたい場合はこちらのコードが有効です。
途中から記事を表示させるとブラウザの一番上から続きが表示されるわけで、ちょっと見にくいと思うんですよね。

function custom_content_more_link( $output ) {
  $output = preg_replace('/#more-[\d]+/i', '', $output );
  return $output;
}
add_filter('the_content_more_link', 'custom_content_more_link');

コメント欄の下にある使えるHTMLタグの案内を削除する

コメント欄についてくる「次のHTML タグと属性が使えます…」という文言ですが、コメントにHTMLタグをつける人はあまりいないので、必要と感じません。

add_filter("comment_form_defaults","comment_after_delete");
function comment_after_delete($args) {
  $args['comment_notes_after'] = '';
  return $args;
}

抜粋の終わりに表示される、[…]を変更する

the_excerptを使うとデフォルトでは[…]が末尾についてきますが、どうもしっくり来ません。
そこで私は「 …」に変更しています。

function new_excerpt_more($more) {
  return ' ...';
}
add_filter('excerpt_more', 'new_excerpt_more');

コメント欄の必須項目を名前だけにする

WordPressでコメント欄ですが、デフォルトだと名前とメールアドレスが必須項目になっています。
名前は入れて欲しいですが、メールアドレスはそれほどでもないというか自分だったら強制されると若干嫌なのでこの機能を切ります。
この機能は[設定]→[ディスカッション]で「名前とメールアドレスの入力を必須にする」という項目のチェックを外しておく必要があります。

実はこの関数、最初はコアファイル(wp-comments-post.php)を編集してましたが、最近このコードを発見してfunctions.phpに書きました。
コアファイルだとアップデート毎に書き換えなければならなく、煩わしかったのですがようやくその作業から開放されました。

function preprocess_comment_author( $commentdata ) {
  if ("" === trim( $commentdata['comment_author'] ) )
    wp_die('<strong>エラー</strong>: 名前を入力してください。');
    return $commentdata;
}
add_filter( 'preprocess_comment', 'preprocess_comment_author', 1);

パーマリンクを自動連番にする

これもコアファイルに元々書いていたコードです。
SEO的にはスラッグは記事タイトルとかがいいみたいですけどね。
連番にするには[設定]→[パーマリンク設定]で「カスタム構造」にチェックを入れ

/%postname%/

などとしてやる必要があります。

これは既に投稿されたスラッグはそのままで、新しく記事を作る時だけ+1されたスラッグになります。

function change_slug() {
  global $post;
  if (get_post_type($post) != 'page') {
    $post->post_name = count_user_posts($post->post_author) + 1;
  }
}
add_action( 'admin_print_styles-post-new.php', 'change_slug', 1000 );

管理画面の記事/固定ページ一覧のテーブルにIDの列を加える

IDが一覧に表示されると、時々ですが確認することがあるので地味に便利です。

add_filter('manage_posts_columns', 'posts_columns_id', 5);
add_action('manage_posts_custom_column', 'posts_custom_id_columns', 5, 2);
add_filter('manage_pages_columns', 'posts_columns_id', 5);
add_action('manage_pages_custom_column', 'posts_custom_id_columns', 5, 2);
function posts_columns_id($defaults) {
  $defaults['wps_post_id'] = __('ID');
  return $defaults;
}
function posts_custom_id_columns($column_name, $id) {
  if ($column_name === 'wps_post_id') {
    echo $id;
  }
}

 

「リンクの挿入」ボタンにクラスを追加する

「リンクの挿入」にはクラスという項目がありますが、そこにクラスを追加するコードです。
私はLightboxで表示させるクラスとURLを新しいタブで開くためのクラスを追加しています。

function custom_anchor_class_settings( $initArray ) {
  $initArray['theme_advanced_styles'] = "Blank=target_blank;Lightbox=lightbox";
  return $initArray;
}
add_filter( 'tiny_mce_before_init', 'custom_anchor_class_settings' );

記事ごとにCSSを加える

めったに使うことはないですが、あれば便利なので一応書いています。
といっても固定ページでは多用しています。
普段は非表示でいいと思いますがね。

add_action('admin_menu', 'custom_css_hooks');
add_action('save_post', 'save_custom_css');
add_action('wp_head','insert_custom_css');
function custom_css_hooks() {
  add_meta_box('custom_css', '追加するCSS', 'custom_css_input', 'post', 'normal', 'high');
  add_meta_box('custom_css', '追加するCSS', 'custom_css_input', 'page', 'normal', 'high');
}
function custom_css_input() {
  global $post;
  echo '<input id="custom_css_noncename" type="hidden" name="custom_css_noncename" value="'.wp_create_nonce('custom-css').'" />';
  echo '<textarea id="custom_css" style="width: 100%;" cols="30" name="custom_css" rows="5">'.get_post_meta($post->ID,'_custom_css',true).'</textarea>';
}
function save_custom_css($post_id) {
  if (!wp_verify_nonce($_POST['custom_css_noncename'], 'custom-css')) return $post_id;
  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return $post_id;
  $custom_css = $_POST['custom_css'];
  update_post_meta($post_id, '_custom_css', $custom_css);
}
function insert_custom_css() {
  if (is_page() || is_single()) {
    if (have_posts()) : while (have_posts()) : the_post();
      echo '<style type="text/css">'.get_post_meta(get_the_ID(), '_custom_css', true).'</style>'."\n";
      endwhile; endif;
    rewind_posts();
  }
}

記事ごとにJavaScriptを加える

CSSと同様です。

add_action('admin_menu', 'custom_js_hooks');
add_action('save_post', 'save_custom_js');
add_action('wp_head','insert_custom_js');
function custom_js_hooks() {
  add_meta_box('custom_js', '追加するJavascript', 'custom_js_input', 'post', 'normal', 'high');
  add_meta_box('custom_js', '追加するJavascript', 'custom_js_input', 'page', 'normal', 'high');
}
function custom_js_input() {
  global $post;
  echo '<input id="custom_js_noncename" type="hidden" name="custom_js_noncename" value="'.wp_create_nonce('custom-js').'" />';
  echo '<textarea id="custom_js" style="width: 100%;" cols="30" name="custom_js" rows="10">'.get_post_meta($post->ID,'_custom_js',true).'</textarea>';
}
function save_custom_js($post_id) {
  if (!wp_verify_nonce($_POST['custom_js_noncename'], 'custom-js')) return $post_id;
  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return $post_id;
  $custom_js = $_POST['custom_js'];
  update_post_meta($post_id, '_custom_js', $custom_js);
}
function insert_custom_js() {
  if (is_page() || is_single()) {
    if (have_posts()) : while (have_posts()) : the_post();
      echo '<script type="text/javascript">'.get_post_meta(get_the_ID(), '_custom_js', true).'</script>'."\n";
      endwhile; endif;
    rewind_posts();
  }
}

記事内に短縮URLがあれば展開する

これはサブサイト(フォトログ)で使っているコードです。
写真の投稿はiftttをつかってflickrからWorpdressの下書きに自動送信していたんですが、最近送信される際に短縮URL(ift.tt)が使われるようになりました。
そのせいで画像がLightboxで表示できなくなったので短縮URLを展開するために書いています。
ここでは使いやすくするため、ift.tt専用ではなく一般的なコードを書いています。
ですのでbit.lyなども展開できます。
ちなみにこのコードを使うとかなり重くなりますので注意が必要です。
(現在はifttt側で短縮URLを使わない設定ができるのでこのコードは使っていません)

function get_longUrl($short_url) {
  $h = get_headers($short_url, 1);
  if (isset($h['Location'])) {
    $long_url = $h['Location'];
    if (is_array($long_url)) {
      $long_url = end($long_url);
    }
  } else {
    $long_url = $short_url;
  }
  return $long_url;
}
function the_content_replace($text) {
  $pattern = '/https?:\/\/[\w\/:%#\$&\?\(\)~\.=\+\-]+/i';
  preg_match_all($pattern, $text, $match, PREG_PATTERN_ORDER);
  if (is_array($match[0])) {
    foreach($match[0] as $key => $url) {
      $true_url[$key] = get_longUrl($url);
    }
  }
  return str_replace($match[0], $true_url, $text);
}
add_filter('the_content', 'the_content_replace');

記事の一番最初の画像を取得してサムネイルにする

これもフォトログで使っているのですが、関連記事を載せる際にサムネイルに困るのでこの方法を取りました。

function catch_that_image() {
  global $post, $posts;
  $first_img = '';
  ob_start();
  ob_end_clean();
  $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
  $first_img = $matches [1][0];
  if (empty($first_img)) {
    $first_img = "/images/default.jpg";
  }
  return $first_img;
}

上記のコードをfunctions.phpに書いてテーマファイルの任意の場所に

echo catch_that_image();

と書くことで記事の一番最初の画像のURLを出力できます。


自分のサイトでfunctions.phpに使っているコードをほとんど書いてしまいました。
全部は紹介しきれていないですが、8割ぐらいは書いたつもりです。
便利と思うコードがあって、あなたのサイトのfunctions.phpに書いていただけたなら幸いです。

スポンサーリンク

Leave a Comment