カテゴリー: WordPress

WordPress に関係する記事。テーマやプラグインのことを綴っています。

  • header, footer に必須のテンプレートタグを入れ、管理バーが無事に出るまでの【テーマ作成 その③】

    header, footer に必須のテンプレートタグを入れ、管理バーが無事に出るまでの【テーマ作成 その③】

    【テーマ作成 その②】からの続き。

     

    流れを追いたい方は記事を辿るか、Githubのコミットを追いかけてください。

    header で必要なテンプレートタグを記述

    WodrPress Codexのテーマ開発、Template File Checklist 項を見ながら。

    language_attributes() を <html> に含める

    テキスト方向、言語情報の属性をセットしてくれる関数。

    IE用に振り分けされているので各々記述。

     <!DOCTYPE html>
     <!--[if lt IE 7]>
    -<html class="no-js lt-ie9 lt-ie8 lt-ie7"><![endif]-->
    +<html <?php language_attributes(); ?> class="no-js lt-ie9 lt-ie8 lt-ie7"><![endif]-->
     <!--[if IE 7]>
    -<html class="no-js lt-ie9 lt-ie8"><![endif]-->
    +<html <?php language_attributes(); ?> class="no-js lt-ie9 lt-ie8"><![endif]-->
     <!--[if IE 8]>
    -<html class="no-js lt-ie9"><![endif]-->
    +<html <?php language_attributes(); ?> class="no-js lt-ie9"><![endif]-->
     <!--[if gt IE 8]><!-->
    -<html class="no-js"><!--<![endif]-->
    +<html <?php language_attributes(); ?> class="no-js"><!--<![endif]-->

    文字コードの <meta> 要素を記述

    これはタイトルや他のメタ情報より前に書かんとだめなやつです。

    設定で設定したものが反映されます。

    -  <meta charset="utf-8">
    +  <meta charset="<?php bloginfo( 'charset' ); ?>" />

    <title> 要素に wp_title() をセット

    wp_title() はそのまんま、タイトルを返す関数(WordPress 2.5 ~

    <title> じゃないところでも使えたり、区切り文字等の引数を指定できたりします。

    とりあえずそのまま記述。

    -  <title></title>
    +  <title><?php wp_title(); ?></title>

    <meta> description要素に bloginfo() をセット

    ページ概要のメタタグに bloginfo( ‘description’ ) を記述。

    設定 > 一般 で入力してある “サイトの簡単な説明” が出ます。

    -  <meta name="description" content="">
    +  <meta name="description" content="<?php bloginfo( 'description' ); ?>">

    wp_head() を記述

    プラグインのスタイルシートやスクリプトはこの関数にフックされているので、これを書かないとちょっと困ったことになります。

    ゴリゴリに自前でテーマを弄るなら書かなくても問題ないです。

    気合い入ってる企業サイトでは敢えて書いてないところもあります。

    </head> 直前に記述。

    +  <?php wp_head(); ?>
     </head>

    <body> に <?php body_class(); ?> を付加

    header に含んでいるのでここで。

    body、投稿、コメント要素にWordPressが生成するクラスの属性を追加する関数。

    投稿の場合はループ内の要素にのみ適用。

     </head>
    -<body>
    +<body <?php body_class(); ?>>

    functions.php

    Codex の Functions File Explained というところに色々と書かれてます。

    テーマ弄るときに触ったことがある人もいるのでは?

    ざっくりざっくり言うと、ここに色々書いていけば機能を増やしたり色々拡張できたりするやつです。

    functions.php でやりたいことができるようになればプラグインを作ることができるのと同義、ってぐらいな勢いです。

    と同時に、functions.php でミスがあると正常動作しなくなることもあります。

    functions.php を作成

    新規でphpファイルを作ります、こんな感じ(この段階ではコメントだけなので何ら動作しない

    <?php
    /**
     * functions
     *
     * テーマでは、functions.phpという名前の関数ファイルを使用することができます
     * 基本的にプラグインのように動作し、テーマに存在していれば自動的にWordPressの初期化時に読み込まれます
     *
     * @package    WordPress
     * @subpackage Hoho
     */

    で、functions.php、一番最後の閉じ ?> は不要です、むしろ書くとよろしくないです。(functions.php に限らず php ってそうだよね

    ※関数ごとのやつは絶対いりますよ!一番最後だけ!いらない。

    <?php
    
    function hoho() {
    	//処理
    } ?>
    
    <!-- いろいろあって -- >
    
    <?php

     

    気になるひとは調べてみましょう。

    RSSフィード機能を追加

    RSS、出さないとダメですよねやっぱり。

    WordPress 3.0 から、RSSフィードは functions.php に書くことになってます。書きます。

    <?php
    /**
     * functions
     *
     * テーマでは、functions.phpという名前の関数ファイルを使用することができます
     * 基本的にプラグインのように動作し、テーマに存在していれば自動的にWordPressの初期化時に読み込まれます
     *
     * @package    WordPress
     * @subpackage Hoho
     */
    
    /**
     * 自動的にRSSフィードのリンクを挿入
     *
     * @since WordPress 3.0
     */
    add_theme_support( 'automatic-feed-links' );

    functions.php はたいてい色々書きすぎてぐちゃーなるので、追って整理します。

    ぐちゃーとなるまでは書き足していきます。

    footer で必要なテンプレートタグを記述

    footer には必須のやつが1つ。

    wp_footer()

    これがないと wp_header() と同じく、プラグイン等がちゃんと動きません。

    </body> 直前に。

    +<?php wp_footer(); ?>
     </body>

     

    ここまでできたら管理バーが無事表示されるはず!

    管理バー出奴
    管理バー出奴

     

    やっと管理バー、道はまだまだ長いです。

    ここまでのソースコードはこちら

    次回以降、投稿を表示したりサイドバーのウィジェットを実装したり。

  • cssを反映させたり、header, sidebar, footer に分けたり。テンプレートタグを記述していく。【テーマ作成 その②】

    cssを反映させたり、header, sidebar, footer に分けたり。テンプレートタグを記述していく。【テーマ作成 その②】

    WordPressテーマを作り始める。Initializr HTML5 というhtmlなテンプレートを元に。からのつづきです。

     

    前回はテーマの有効化まででした。

    Codexのテーマ開発ページ順序にできるだけ沿って進みます。(というかCodexの通りにやればできあがるはずなんですよ

    テンプレートタグを書く前にcssを

    前回 style.css を作成しました。

    今後 style.css にスタイルは書きません、style.css はテーマ情報を書くものとして捉えます。

    sassless を使うつもりなのでディレクトリ構造的にもそのほうが管理しやすいからです。

    css は sass に変換してテーマを作ります、わからない人は以前sassについて書いた記事を読むか、すっ飛ばしてください。

    css をちょっと修正

    Initializr という素晴らしいフレームワークなのですが若干修正。

    --- a/css/main.css
    +++ b/css/main.css
    @@ -49,10 +49,10 @@ textarea {
     }
    
     .chromeframe {
    -    margin: 0.2em 0;
    +    margin: .2em 0;
         background: #ccc;
         color: #000;
    -    padding: 0.2em 0;
    +    padding: .2em 0;
     }
    
    @@ -137,7 +137,7 @@ nav a:hover {
    
     .main aside {
         color: white;
    -    padding: 0px 5% 10px;
    +    padding: 0 5% 10px;
     }
    
     .footer-container footer {
    @@ -206,7 +206,7 @@ nav a:hover {
         }
    
         .oldie nav a {
    -        margin: 0 0.7%;
    +        margin: 0 .7%;
         }
     }

    これはWordPressコーディングガイドラインに則って。

    次になぜか残ったままのバグを修正

    --- a/css/main.css
    +++ b/css/main.css
    @@ -205,7 +205,7 @@ nav a:hover {
             display: inline;
         }
    
    -    .oldie nav a {
    +    .lt-ie9 nav a {
             margin: 0 .7%;
         }
     }

    で、この後 css を scss に変換したり、 IE 用のスタイルを切り分けたり、scssをさらにsassに変換したり。

    このあたりは自分の勉強のためやっておく。

    とりあえずsassにしてコンパイルしたcssがこれ ↓

    /* ==========================================================================
     * Normalize
     * ========================================================================== */
    /*! normalize.css v1.1.2 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-size:100%;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}html,button,input,select,textarea{font-family:sans-serif}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em;margin:.83em 0}h3{font-size:1.17em;margin:1em 0}h4{font-size:1em;margin:1.33em 0}h5{font-size:.83em;margin:1.67em 0}h6{font-size:.67em;margin:2.33em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:1em 40px}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}p,pre{margin:1em 0}code,kbd,pre,samp{font-family:monospace,serif;_font-family:'courier new',monospace;font-size:1em}pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word}q{quotes:none}q:before,q:after{content:'';content:none}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}dl,menu,ol,ul{margin:1em 0}dd{margin:0 0 0 40px}menu,ol,ul{padding:0 0 0 40px}nav ul,nav ol{list-style:none;list-style-image:none}img{border:0;-ms-interpolation-mode:bicubic}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0;white-space:normal;*margin-left:-7px}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;*overflow:visible}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*height:13px;*width:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0} */
    /* ==========================================================================
     * Main Styles
     * ========================================================================== */
    /* ==========================================================================
     * HTML5 Boilerplate styles - h5bp.com (generated via initializr.com)
     * ========================================================================== */
    html,
    button,
    input,
    select,
    textarea {
      color: #222222;
    }
    
    body {
      font-size: 1em;
      line-height: 1.4;
    }
    
    ::-moz-selection,
    ::selection {
      background: #b3d4fc;
      text-shadow: none;
    }
    
    hr {
      display: block;
      height: 1px;
      border: 0;
      border-top: 1px solid #cccccc;
      margin: 1em 0;
      padding: 0;
    }
    
    img {
      vertical-align: middle;
    }
    
    fieldset {
      border: 0;
      margin: 0;
      padding: 0;
    }
    
    textarea {
      resize: vertical;
    }
    
    .chromeframe {
      margin: 0.2em 0;
      background: #cccccc;
      color: black;
      padding: 0.2em 0;
    }
    
    /* ===== Initializr Styles ==================================================
     * Author: Jonathan Verrecchia - verekia.com/initializr/responsive-template
     * ========================================================================== */
    body {
      font: 16px/26px Helvetica, Helvetica Neue, Arial;
    }
    
    .wrapper {
      width: 90%;
      margin: 0 5%;
    }
    
    /* ===================
     *  ALL: Orange Theme
     * =================== */
    .header-container {
      border-bottom: 20px solid #e44d26;
    }
    
    .footer-container,
    .main aside {
      border-top: 20px solid #e44d26;
    }
    
    .header-container,
    .footer-container,
    .main aside {
      background: #f16529;
    }
    
    .title {
      color: white;
    }
    
    /* ==============
     *  MOBILE: Menu
     * ============== */
    nav ul {
      margin: 0;
      padding: 0;
    }
    nav a {
      display: block;
      margin-bottom: 10px;
      padding: 15px 0;
      text-align: center;
      text-decoration: none;
      font-weight: bold;
      color: white;
      background: #e44d26;
    }
    nav a:hover, nav a:visited {
      color: white;
    }
    nav a:hover {
      text-decoration: underline;
    }
    
    /* ==============
     *  MOBILE: Main
     * ============== */
    .main {
      padding: 30px 0;
    }
    .main article h1 {
      font-size: 2em;
    }
    .main aside {
      color: white;
      padding: 0 5% 10px;
    }
    
    .footer-container footer {
      color: white;
      padding: 20px 0;
    }
    
    /* ==========================================================================
     * Author's custom styles
     * ========================================================================== */
    /* ==========================================================================
     * Media Queries
     * ========================================================================== */
    @media only screen and (min-width: 480px) {
      /* ====================
       *  INTERMEDIATE: Menu
       * ==================== */
      nav a {
        float: left;
        width: 27%;
        margin: 0 1.7%;
        padding: 25px 2%;
        margin-bottom: 0;
      }
      nav li:first-child a {
        margin-left: 0;
      }
      nav li:last-child a {
        margin-right: 0;
      }
    }
    @media only screen and (min-width: 768px) {
      /* ====================
       *  WIDE: CSS3 Effects
       * ==================== */
      .header-container,
      .main aside {
        -webkit-box-shadow: 0 5px 10px #aaaaaa;
        -moz-box-shadow: 0 5px 10px #aaaaaa;
        box-shadow: 0 5px 10px #aaaaaa;
      }
    
      /* ============
       *  WIDE: Menu
       * ============ */
      .title {
        float: left;
      }
    
      nav {
        float: right;
        width: 38%;
      }
    
      /* ============
       *  WIDE: Main
       * ============ */
      .main article {
        float: left;
        width: 57%;
      }
      .main aside {
        float: right;
        width: 28%;
      }
    }
    @media only screen and (min-width: 1140px) {
      /* ===============
       *  Maximal Width
       * =============== */
      .wrapper {
        width: 1026px;
        /* 1140px - 10% for margins */
        margin: 0 auto;
      }
    }
    /* ==========================================================================
     * Helper classes
     * ========================================================================== */
    .ir {
      background-color: transparent;
      border: 0;
      overflow: hidden;
      *text-indent: -9999px;
    }
    .ir:before {
      content: "";
      display: block;
      width: 0;
      height: 150%;
    }
    
    .hidden {
      display: none !important;
      visibility: hidden;
    }
    
    .visuallyhidden {
      border: 0;
      clip: rect(0 0 0 0);
      height: 1px;
      margin: -1px;
      overflow: hidden;
      padding: 0;
      position: absolute;
      width: 1px;
    }
    .visuallyhidden.focusable:active, .visuallyhidden.focusable:focus {
      clip: auto;
      height: auto;
      margin: 0;
      overflow: visible;
      position: static;
      width: auto;
    }
    
    .invisible {
      visibility: hidden;
    }
    
    .clearfix {
      *zoom: 1;
    }
    .clearfix:before {
      content: " ";
      display: table;
    }
    .clearfix:after {
      content: " ";
      display: table;
      clear: both;
    }
    
    /* ==========================================================================
     * Print styles
     * ========================================================================== */
    @media print {
      * {
        background: transparent !important;
        color: black !important;
        /* Black prints faster: h5bp.com/s */
        box-shadow: none !important;
        text-shadow: none !important;
      }
    
      a {
        text-decoration: underline;
      }
      a:visited {
        text-decoration: underline;
      }
      a[href]:after {
        content: " (" attr(href) ")";
      }
    
      abbr[title]:after {
        content: " (" attr(title) ")";
      }
    
      /* Don't show links for images, or javascript/internal links */
      .ir a:after {
        content: "";
      }
    
      a[href^="javascript:"]:after, a[href^="#"]:after {
        content: "";
      }
    
      pre,
      blockquote {
        border: 1px solid #999999;
        page-break-inside: avoid;
      }
    
      thead {
        display: table-header-group;
      }
    
      /* h5bp.com/t */
      tr {
        page-break-inside: avoid;
      }
    
      img {
        page-break-inside: avoid;
        max-width: 100% !important;
      }
    
      @page {
        margin: 0.5cm;
    }
    
      p,
      h2,
      h3 {
        orphans: 3;
        widows: 3;
      }
    
      h2,
      h3 {
        page-break-after: avoid;
      }
    }
    /* Welcome to Compass. Use this file to write IE specific override styles.
     * Import this file using the following HTML or equivalent:
     * <!--[if IE]>
     *   <link href="/stylesheets/ie.css" media="screen, projection" rel="stylesheet" type="text/css" />
     * <![endif]--> */
    /* ===============
     *  ALL: IE Fixes
     * =============== */
    .ie7 .title {
      padding-top: 20px;
    }
    
    @media only screen and (min-width: 480px) {
      /* ========================
       * INTERMEDIATE: IE Fixes
       * ======================== */
      nav ul li {
        display: inline;
      }
    
      .lt-ie9 nav a {
        margin: 0 0.7%;
      }
    }

     

    css は テーマフォルダ/css/ 以下のものを使うようにします。

    index.php の css, js パスをテンプレートタグで置き換える前にちょっと

    前回のままだとスタイルが反映されません。

    css や js のリソースファイルパスをWordPressのテンプレートタグに書き変え。

    ちょっとこの辺りの関数について。

    get_stylesheet_uri()

    テーマのスタイルシート style.css のURIを返す関数です。

    今回は使いません。

    get_template_directory_uri()

    テーマディレクトリのURI(最後のスラッシュ / は省略されます)を返す関数です。

    子テーマを使ってる場合、親テーマのURIが返されます。

    子テーマで書き変えられたくない場合に使います。

    get_stylesheet_directory_uri()

    テーマディレクトリのURI(最後のスラッシュ / は省略されます)を返す関数です。

    子テーマを使ってる場合、子テーマのURIが返されます。

    get_template_directory_uri() と違うところですね。

    主に画像やリンクで使われます。

     

    という感じ。

    スタイルシートやスクリプトは、wp_enqueue_style や wp_enqueue_scripts を使うほうがいいのですが、順を追うためこれらは後回し。

    パスをテンプレートタグで置き換える

    index.php を開いて書き変え。

    --- a/index.php
    +++ b/index.php
    @@ -14,10 +14,11 @@
     	<meta name="description" content="">
     	<meta name="viewport" content="width=device-width">
    
    -	<link rel="stylesheet" href="css/normalize.min.css">
    -	<link rel="stylesheet" href="css/main.css">
    +	<link rel="stylesheet" href="<?php echo get_stylesheet_directory_uri(); ?>/css/screen.css">
    +	<!--[if lt IE 9]>
    +	<link rel="stylesheet" href="<?php echo get_stylesheet_directory_uri(); ?>/css/ie.css"><![endif]-->
    
    -	<script src="js/vendor/modernizr-2.6.2-respond-1.1.0.min.js"></script>
    +	<script src="<?php echo get_stylesheet_directory_uri(); ?>/js/vendor/modernizr-2.6.2-respond-1.1.0.min.js"></script>
     </head>
     <body>
     <!--[if lt IE 7]>
    @@ -84,10 +85,10 @@
     </div>
    
     <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
    -<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.1.min.js"><\/script>')</script>
    +<script>window.jQuery || document.write('<script src="<?php echo get_stylesheet_directory_uri(); ?>/js/vendor/jquery-1.10.1.min.js"><\/script>')</script>
    
    -<script src="js/plugins.js"></script>
    -<script src="js/main.js"></script>
    +<script src="<?php echo get_stylesheet_directory_uri(); ?>/js/plugins.js"></script>
    +<script src="<?php echo get_stylesheet_directory_uri(); ?>/js/main.js"></script>
    
     <script>
     	var _gaq = [

    こんな感じで書き変えましたー。

    これでcssが効きます。

    表示された
    表示された。管理バーはまだ。

    index.php から header, sidebar, footer を切り出す

    index.php が少しは形になったので基本テンプレートの3つを分けます。

    header.php

    ヘッダー部分は上からまるごと、ナビゲーション下のところまで。

    <?php
    /**
     * ヘッダー
     *
     * <head> セクションをすべてと、<div class="main-container"> までを表示
     *
     * @package    WordPress
     * @subpackage Hoho
     */
    ?>
    <!DOCTYPE html>
    <!--[if lt IE 7]>
    <html class="no-js lt-ie9 lt-ie8 lt-ie7"><![endif]-->
    <!--[if IE 7]>
    <html class="no-js lt-ie9 lt-ie8"><![endif]-->
    <!--[if IE 8]>
    <html class="no-js lt-ie9"><![endif]-->
    <!--[if gt IE 8]><!-->
    <html class="no-js"><!--<![endif]-->
    <head>
    	<meta charset="utf-8">
    	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    	<title></title>
    	<meta name="description" content="">
    	<meta name="viewport" content="width=device-width">
    
    	<link rel="stylesheet" href="<?php echo get_stylesheet_directory_uri(); ?>/css/screen.css">
    	<!--[if lt IE 9]>
    	<link rel="stylesheet" href="<?php echo get_stylesheet_directory_uri(); ?>/css/ie.css"><![endif]-->
    
    	<script src="<?php echo get_stylesheet_directory_uri(); ?>/js/vendor/modernizr-2.6.2-respond-1.1.0.min.js"></script>
    </head>
    <body>
    <!--[if lt IE 7]>
    <p class="chromeframe">You are using an <strong>outdated</strong> browser. Please
    	<a href="http://browsehappy.com/">upgrade your browser</a> or
    	<a href="http://www.google.com/chromeframe/?redirect=true">activate Google Chrome Frame</a> to improve your experience.
    </p>
    <![endif]-->
    
    <div class="header-container">
    	<header class="wrapper clearfix">
    		<h1 class="title">h1.title</h1>
    		<nav>
    			<ul>
    				<li><a href="#">nav ul li a</a></li>
    				<li><a href="#">nav ul li a</a></li>
    				<li><a href="#">nav ul li a</a></li>
    			</ul>
    		</nav>
    	</header>
    </div>
    
    <div class="main-container">

     

    sidebar.php

    サイドバーは <aside> 部分。

    <?php
    /**
     * サイドバー
     *
     * メインウィジェット領域を含むサイドバー。
     *
     * @package    WordPress
     * @subpackage Hoho
     */
    ?>
    
    <aside>
    	<h3>aside</h3>
    
    	<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam sodales urna non odio egestas tempor. Nunc vel vehicula ante. Etiam bibendum iaculis libero, eget molestie nisl pharetra in. In semper consequat est, eu porta velit mollis nec. Curabitur posuere enim eget turpis feugiat tempor. Etiam ullamcorper lorem dapibus velit suscipit ultrices.</p>
    </aside>

     

    footer.php

    フッターはヘッダーで切った class=”main-container” の閉じタグから下全部。

    <?php
    /**
     * フッター
     *
     * class="main-container" div の閉じタグ以降のコンテンツ
     *
     * @package    WordPress
     * @subpackage Hoho
     */
    ?>
    
    </div>
    <!-- #main-container -->
    
    <div class="footer-container">
    	<footer class="wrapper">
    		<h3>footer</h3>
    	</footer>
    </div>
    
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
    <script>window.jQuery || document.write('<script src="<?php echo get_stylesheet_directory_uri(); ?>/js/vendor/jquery-1.10.1.min.js"><\/script>')</script>
    
    <script src="<?php echo get_stylesheet_directory_uri(); ?>/js/plugins.js"></script>
    <script src="<?php echo get_stylesheet_directory_uri(); ?>/js/main.js"></script>
    
    <script>
    	var _gaq = [
    		['_setAccount', 'UA-XXXXX-X'],
    		['_trackPageview']
    	];
    	(function (d, t) {
    		var g = d.createElement(t), s = d.getElementsByTagName(t)[0];
    		g.src = '//www.google-analytics.com/ga.js';
    		s.parentNode.insertBefore(g, s)
    	}(document, 'script'));
    </script>
    </body>
    </html>

     

    index.php

    それぞれheader, sidebar, footer があったところに各々、

    • get_header()
    • get_sidebar()
    • get_footer()

    を書く。

    <?php
    /**
     * メインのテンプレートファイル
     *
     * WordPressテーマに必要な2つのテンプレートファイルのうち最も基本的なもの(もう一つは style.css)。
     * 特定のクエリに一致しない時にページを表示するため読み込まれる。
     * 例: home.phpファイルが存在しない時に使われる。
     * 詳しくは Codex へ: http://codex.wordpress.org/Template_Hierarchy
     *
     * @package    WordPress
     * @subpackage Hoho
     */
    
    get_header(); ?>
    
    <div class="main wrapper clearfix">
    
    	<article>
    		<header>
    			<h1>article header h1</h1>
    
    			<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam sodales urna non odio egestas tempor. Nunc vel vehicula ante. Etiam bibendum iaculis libero, eget molestie nisl pharetra in. In semper consequat est, eu porta velit mollis nec.</p>
    		</header>
    		<section>
    			<h2>article section h2</h2>
    
    			<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam sodales urna non odio egestas tempor. Nunc vel vehicula ante. Etiam bibendum iaculis libero, eget molestie nisl pharetra in. In semper consequat est, eu porta velit mollis nec. Curabitur posuere enim eget turpis feugiat tempor. Etiam ullamcorper lorem dapibus velit suscipit ultrices. Proin in est sed erat facilisis pharetra.</p>
    		</section>
    		<section>
    			<h2>article section h2</h2>
    
    			<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam sodales urna non odio egestas tempor. Nunc vel vehicula ante. Etiam bibendum iaculis libero, eget molestie nisl pharetra in. In semper consequat est, eu porta velit mollis nec. Curabitur posuere enim eget turpis feugiat tempor. Etiam ullamcorper lorem dapibus velit suscipit ultrices. Proin in est sed erat facilisis pharetra.</p>
    		</section>
    		<footer>
    			<h3>article footer h3</h3>
    
    			<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam sodales urna non odio egestas tempor. Nunc vel vehicula ante. Etiam bibendum iaculis libero, eget molestie nisl pharetra in. In semper consequat est, eu porta velit mollis nec. Curabitur posuere enim eget turpis feugiat tempor.</p>
    		</footer>
    	</article>
    
    	<?php get_sidebar(); ?>
    
    </div>
    <!-- #main -->
    
    <?php get_footer(); ?>

     

    とりあえず今回はこれで。

    css等、若干端折ってるところがあるので Github のコミットを追ってもらうのが間違いないです。

    次はWordPressのテーマに必須なテンプレートタグを使っていく予定です。

  • WordPressテーマを作り始める。Initializr HTML5 というhtmlなテンプレートを元に。【テーマ作成 ①】

    WordPressテーマを作り始める。Initializr HTML5 というhtmlなテンプレートを元に。【テーマ作成 ①】

    WordPressのテーマを作る。テーマを作るための下準備・知っておいた方がいいこと。 からの続きになります。

     

    1から作るとは言ったものの、0から作るのは時間がかかるので、WordPressのテーマ用ではないHTML5なテンプレートを元に作っていきます。

    せっかくなんで対応バージョンは3.6以上をターゲットに。

    「テーマなんて作ったことないよー(つд⊂)エーン」なひとはいっしょにぜひ。

    順次 Github にコミットしていきます。(最初張り切って英語でコミットしてますがそのうち日本語になるはず

    WordPressに超絶詳しいわけでは全くないので不備等あったら是非コメントくださいまし。

    自分でテーマを作ることのメリット

    メリット、考えてみました。

    • ソース全部を把握できる…はず
    • テーマの更新に惑わされない
    • やりたい放題
    • 色々試せる
    • 日本語だけに対応すればいい(日本用なら
    • 作りながらWordPressの勉強ができる

    こんな感じですかね。やっぱり実際に打ち込んで動かさないと覚えられないです。

     

    自分でテーマを作ることのデメリット

    対してデメリットも考えてみました。

    • 飽きる
    • やる気と比例してクオリティが上下(下がりがち
    • セキュリティ云々とかよくわかんない
    • こんな記事を書いたりすると怖いひとに突撃されるかもしれない

    デメリットはないも同然ですね!

    失敗して学ぶことの方が多いと思います。継続することが大事、あきらめないように。

    わからないところは学びながらやればいいんですよきっと。

     

    Initializrってなによ

    HTML5 Boilerplate という HTML5 のフレームワークをベースにしたHTML5テンプレートのジェネレーターです。

    HTML5 Boilerplate についてはHTML5カルタでおなじみの webcre8 さんが詳しく書いてらっしゃるので見ればいいと思うよ!

    簡単に言うと “HTML5でマークアップされた便利な機能がいっぱい詰まったテンプレートだよ” ってやつです。

     

    Initializr でテンプレートを生成

    まずは Initializrサイトへ。

    デモを見るもよし、ドキュメントを見るもよしです。

    レスポンシブなほうが望ましいのでレスポンシブをクリックしカスタマイズ画面へ。

    流行りのれすぽん
    流行りのれすぽん

    クリックするとチューニングが開き、カスタムできます。

    モバイルファースト等、とりあえず全部選んで Download it!

    だうんろーどいっと
    だうんろーどいっと

    Initializr のファイル構成

    jQuery の開発版以外はフルで選択しましたので色々詰まっています。

    ファイル構成はこんな ↓ 感じ

    initializr
    │  .htaccess
    │  404.html
    │  apple-touch-icon-114x114-precomposed.png
    │  apple-touch-icon-144x144-precomposed.png
    │  apple-touch-icon-57x57-precomposed.png
    │  apple-touch-icon-72x72-precomposed.png
    │  apple-touch-icon-precomposed.png
    │  apple-touch-icon.png
    │  crossdomain.xml
    │  favicon.ico
    │  humans.txt
    │  index.html
    │  robots.txt
    │  
    ├─css
    │      main.css
    │      normalize.css
    │      normalize.min.css
    │      
    ├─img
    └─js
        │  main.js
        │  plugins.js
        │  
        └─vendor
                jquery-1.10.1.js
                jquery-1.10.1.min.js
                modernizr-2.6.2-respond-1.1.0.min.js

    シンプルな構成ですね。

    とりあえずこれフォルダごとをWordPressのthemesフォルダ( ~/wp-content/themes/ )に入れちゃいまして進めます。

    フォルダ名はテーマに付けたい名前に変えておきましょう。※空白・日本語はダメです

    もちろんWordPressテーマでないためこのままではテーマとして認識しません。

    WordPressテーマに作り変えていく

    いよいよです、ここからはWodrdPress Codexに従って触っていきます。

     

    まずは style.css を作成

    テーマを触ったことがある人なら見たことがあるかも、これがないと話になりません。

    テーマの情報(スタイルも)を記述するところ。

    Codexのサンプルより

    /*
    Theme Name: Twenty Ten
    Theme URI: http://wordpress.org/
    Description: The 2010 default theme for WordPress.
    Author: wordpressdotorg
    Author URI: http://wordpress.org/
    Version: 1.0
    Tags: black, blue, white, two-columns, fixed-width, custom-header, custom-background, threaded-comments, sticky-post, translation-ready, microformats, rtl-language-support, editor-style, custom-menu (optional)
    
    License:
    License URI:
    
    General comments (optional).
    */

    style.css という名前で新規ファイルを作りサンプルをコピペして適宜変えます。

    /*
    Theme Name: テーマ名(日本語でも可)
    Theme URI: テーマのURL
    Description: テーマの説明
    Author: 作成者
    Author URI: 作成者URL
    Version: バージョンナンバー
    Tags: タグ
    
    License: ライセンス形式
    License URI: ライセンスURL
    
    ここは好きに記述
    */

    ちなみにぼくはこう。

    /*
    Theme Name: Hoho
    Theme URI: http://hayashikejinan.com
    Description: hoho theme for WordPress.
    Author: hayashikejinan
    Author URI: http://profiles.wordpress.org/hayashikejinan
    Version: 0.1
    Tags: orange, two-columns
    
    License:
    License URI:
    
    好きに書いていいところ
    */

     

    index.php を作ってテーマとして認識させる

    style.css でテーマの記述が終わったので次は index.php を作ってテーマとして認識できるようにします。

    といっても、テンプレートに index.html があるのでリネームすればOKです。

    拡張子が見えないひとは見えるようにしておきましょう。(ついでに 404.html も 404.php にしておく

     

    リネームができたらWordPress管理画面より 外観 > テーマ へ。

    できてる!
    できてる!

    テーマを有効化して確認

    有効化してやります。

    おー
    おー

    サイトを表示してみます。

    まっちろ
    まっちろ

     

    cssが読み込まれず、管理バーも表示されません。

    ここからWordPress独自のテンプレートタグを使って組んでいきます。(ここまでをダウンロード

     

    つづくはず

  • WordPressのテーマを作る。テーマを作るための下準備・知っておいた方がいいこと。【テーマ作成 ⓪】

    WordPressのテーマを作る。テーマを作るための下準備・知っておいた方がいいこと。【テーマ作成 ⓪】

    テーマ、作ろうと思いまして。

    せっかくなんで色々順序を追って一通りできるまでを記事にしていきます。

    テーマ作成はローカル環境で行うため、既にローカルでWordPressが動いているひと向けです。

     

    WordPressのコーディングスタンダードをチェック

    コーディングスタンダードというのはまぁ簡単に言うと、

    「書き方は統一しようぜ!」

    です、インデントや空白の扱い、クラス名の命名規則等細かくあります。

    できるだけ則ったほうがいいので目を通しておきましょう。(全部書こうとしたんですけどCSSのところで3,000字超えたので別途いずれ)

     

    テーマ開発に必須なプラグインを入れる。

    テーマを作るなら必須です。

    Theme Checkでエラーが出まくる非公式テーマ、よく見ます。

     

    Theme-Check

    最新のWordPressに則った仕様になっているかテーマをテストするための開発ツール。

    Theme Check サンプル画像
    Theme Check サンプル画像

     

    Theme Check サンプル画像2
    Theme Check サンプル画像2

     

    Debug Bar

    デバッグモード有効時、管理バーにデバッグメニューを追加してくれます。

    クエリ・キャッシュ・および他の有用なデバッグ情報を表示。

    Debug Bar サンプル
    Debug Bar サンプル

     

    デバッグ情報が。
    デバッグ情報が。

     

    テーマ開発に便利なプラグインを入れる。

    必須、とまでは言わないですけどもあると捗るやつです。

    ぼくは入れてます。

     

    Debug Bar Actions and Filters Addon

    必須のところで紹介しました Debug Bar に Action Hooks と Filter Hooks の情報が追加されます。

    Action Hooks
    Action Hooks

     

    Filter Hooks
    Filter Hooks

     

    Show Current Template

    日本の方が作られたプラグイン。

    表示しているページで読み込まれているテンプレートファイルを表示してくれます。

    マウスホバーで
    マウスホバーで

     

    見られます
    見られます

    こんなところです。

     

    ホホまとめ

    海外製のテーマは英語だとしゅっとしてるんですけど日本語にするともっちゃりしてしまったり。

    色々弄ってると結局よくわからないことになったりしません?

    いっそのこと自分で作ってその過程で色々さらに勉強できるのでそうしようかと。

    次回よりテーマ作成進んで行きます。といってもまるごと1から作るのはさすがにあれなんでhtmlフレームワークを使おうと考えてます。

     

    某イベントで「WordPress公式ディレクトリに登録されていないテーマは危険!」という話があったようで。

    試しに色々と見てみましたら Theme Check でエラーいっぱい、デバッグモードでエラー吐く、などが見受けられ。

    あーあー…みたいに思うわけですよ。

  • Table of Contents Plus プラグインが便利過ぎるので日本語化をですね【WordPress】【進捗61%、順次更新します】

    Table of Contents Plus プラグインが便利過ぎるので日本語化をですね【WordPress】【進捗61%、順次更新します】

    素晴らしいプラグインがあったので日本語化を鋭意製作中。

     

    Table-of-Contents-Plus
    このプラグインが…!!

     

    ということで、すこぶる前のめりになりながら公開しときます。

    そのうちちゃんと体裁整えます。

    追尾サイドバーのところに表示されてる感じの。

     

    Table of Contents Plusの日本語化方法

     

    日本語ファイルをダウンロード

    2014.02.21 61%日本語化ファイル→ダウンロードはこちら

     

    プラグインフォルダの言語ディレクトリに突っ込む

    ~/wp-content/plugins/table-of-contents-plus/languages/ ですね。

    突っ込む
    突っ込む

     

    再読込して確認。

    F5とか更新ボタンとか。

    めでたく日本語に!
    めでたく日本語に!

    ※プラグイン本体に含まれていないためプラグイン更新毎にこの手順をやらないといけません。

     

    ある程度訳せたらプラグイン作者さんに渡す予定ですー

  • Twenty FourteenテーマがすでにWordPressの開発段階に!ちょっと触ってみたった。

    Twenty FourteenテーマがすでにWordPressの開発段階に!ちょっと触ってみたった。

    WordPress 3.6がリリースされましたねー。

    定期的にWordPressのGitリポジトリをPullして遊んでるんですけども、さっきPullしてみたらなんとTwenty Fourteenがありました。

    ということで早速試してみましたよー。

    2014年まであと4ヶ月ですね★
    2014年まであと4ヶ月ですね★

    Twenty Fourteenの見た目

    Twenty Thirteenの時はリリースまでに細かいコード変更はあったものの、目に見えるデザインはそんな変わらなかったので変わらないのかな?

    白黒を基調に、というかモノトーンに限りなく近いという。

    リンク系が緑です。

    フロントページ
    フロントページ

    もちろんレスポンシブに対応なさっており。

    幅が狭くなると…
    幅が狭くなると…

     

    狭くなった感じ。
    狭くなった感じ。

    @media分岐は 400, 672, 740, 770, 870, 1008, 1150, 1230pxと細かくありました。

     

    ウィジェットエリアはサイドバー2つ、フッター5つ。

    ウィジェットエリアね
    ウィジェットエリアね

     

    メニューは2つ。

    トップとサイドバーですねー。
    トップとサイドバーですねー。

     

    パッとこんな感じでしたー。

    ホホまとめ

    最新の色々が取り込まれているのでソースを見るだけで勉強になりますまじで。

    「見てみたいぜ!!」

    って方は Github Twenty Fourteenのところ、もしくは今日時点のテーマをzipにしておいたのでダウンロードして見てみてはいかがでしょうか。

    進化するモノに触れられるというのは刺激的でほんと素晴らしいですね。

  • get_post_time で投稿の日時によって処理を変えたかった、というプラグイン作成時のメモ【WordPress】

    get_post_time で投稿の日時によって処理を変えたかった、というプラグイン作成時のメモ【WordPress】

    プラグインを作っていましてですね、投稿日時によって処理を変えたいなーと思ったんです。

    if ( 投稿が1時間以内なら ) {
    	処理1
    } elseif ( 投稿が1日以内なら ) {
    	処理2
    } elseif ( 投稿が1週間以内なら ) {
    	処理3
    } else ( 投稿が1週間以前 ) {
    	処理4
    }

    こんな感じで。

    ただまぁわからないのでいつもの Codex に聞いてみますよ。

     

    get_post_time が使えそう

    はてブしてるのがぼくしかいない関数を発見。日本語訳もないや。

    get_post_time( $d, $gmt, $post, $translate ); で使う。

    このタグはループ内で使えて、現在の投稿の時間を返してくれるんだってさ!

    パラメータは

    • $d …String、指定必須。フォーマット変えるには日付フォーマットのところを参照しろ、とのこと。
      デフォルト値は ‘U’ (unix 形式のタイムスタンプ)
    • $gmt …任意。GMTタイムゾーンの時刻を返すには true
    • $post …任意。postIDを指定、デフォルトは global $post
    • $translate …任意。時刻文字列を翻訳するか否か デフォルトは false

    すな。ただ、$translate は真偽値変えても結果変わらなかったんですよねぇ、謎い。

    <?php
    // get_post_time() 出力例
    echo '結果: ' . get_post_time( 'U', false );
    ?>
    
    結果: 13576608201
    

     

    現在時刻の取得はphp関数の time() で

    time() で unix 形式のタイムスタンプで取得できるので、これと get_post_time() を比較すればいけますね。

    <?php
    // time() 出力例
    echo '結果: ' . time();
    ?>
    
    結果: 1371131722

     

    組み合わせて投稿日時と現在日時の開き具合で振り分けてみる

    コードの検証は以前書いた WordPressの関数をちょっと試したいときにWordPress外のPHPから使うための小技 を使って外部phpで書いてみました。

    時刻は秒で出力されるので、あらかじめ変数で時間を用意しておいて、

    <?php
    
    $hour = 60 * 60; // 1分 × 60 = 1時間
    $day  = $hour * 24; // 1時間 × 24 = 1日
    $time = time(); // 現在時刻のタイムスタンプ
    
    $args = array( 'posts_per_page' => 5);
    $posts_array = get_posts( $args );
    
    // 直近の投稿10件でループ回す
    if ( $posts_array ): foreach ( $posts_array as $post ): setup_postdata( $post );
    
    	// unix 形式で投稿タイムスタンプを取得、int型に一応キャストしておく
    	$post_time = (integer) get_post_time( 'U', false );
    
    	// ここで振り分け処理
    	if ( $time - $hour <= $post_time ) {
    		echo '1時間以内';
    	} elseif ( $time - $day <= $post_time ) {
    		echo '1日以内';
    	} elseif ( $time - $day * 7 <= $post_time ) {
    		echo '1週間以内';
    	} else {
    		echo '1週間以上前';
    	}
    	echo '<br />';
    
    endforeach; endif;
    ?>

    これでバッチリですね 、動かしてみると

    振り分け処理されてる!
    振り分け処理されてる!

    とまぁうまくいきました。

     

    ホホまとめ

    プラグインを作るまで get_post_time なんてWordPress関数知りませんでしたし!

    やっぱり作りたいものがあると色々調べて力になってると実感できます。

    もっと美しい書き方がや訂正あれば是非教えて頂きたく。これやってみて!ってのがあればコメントしてみてください。

  • wp_remote_get は file_get_contents よりも応用できてよいですね【WordPress】

    wp_remote_get は file_get_contents よりも応用できてよいですね【WordPress】

    WordPressプラグイン開発で使う機会があったので覚え書き。

     

    たとえば。外部APIを使って取得したいデータがあるとき。

    PHPだと file_get_contents 関数を使うのがベターですかね。こんな風に。(json_decode の説明は割愛)

    <?php
    /**
     * Googleのはてブ数を取得するサンプル file_get_contents
     */
    $url = 'http://google.com';
    $hatena = json_decode( file_get_contents( 'http://api.b.st-hatena.com/entry.count?url=' . $url ) );
    echo $hatena;
    ?>
    で google.com のはてブ数が出力されます。

     

    これで何の問題もないんです。ただ、エラーが出たときの処理が必要になると途端にコードの量が増えてしまいます。

     

    そこで出てくるのが wp_remote_get という WordPress の関数

    とりあえず Codex を見る。

    wp_remote_get( $url, $args ); で使う。HTTP GET メソッドでURLを配列で返す関数。

    • $url …必須、取得したいURLを指定
    • $args …任意、ヘッダー情報やcookieの配列を指定したい場合に指定

    普通に使う分には $args はスルーして良さげ。

     

    wp_remote_get を使ってみる

    前述のサンプルコード file_get_contents を置き換えて取得してみる。

    外部phpからWordPressの関数を呼び出しますよ)

    <?php
    /**
     * Googleのはてブ数を取得するサンプル wp_remote_get
     */
    $url = 'http://google.com';
    $hatena = wp_remote_get( 'http://api.b.st-hatena.com/entry.count?url=' . $url );
    ?>
    <pre><?php print_r($hatena); ?></pre>

    ↑ のコードで返ってくるのがこれ ↓

    Array
    (
        [headers] => Array
            (
                [server] => nginx/0.8.52
                [date] => Wed, 12 Jun 2013 14:09:18 GMT
                [content-type] => text/plain
                [cache-control] => max-age=1800
                [expires] => Wed, 12 Jun 2013 14:25:14 GMT
                [content-length] => 2
                [x-varnish] => 3020424506 3015334553
                [age] => 844
                [via] => 1.1 varnish
                [connection] => close
            )
    
        [body] => 74
        [response] => Array
            (
                [code] => 200
                [message] => OK
            )
    
        [cookies] => Array
            (
            )
    
        [filename] => 
    )

    [body] に $url の内容が格納されて、各々のステータスもそれぞれ配列に入ってる。

    ということでエラー時の振り分けが簡単にできるんですな。

    まとめると、

    <?php
    /**
     * Googleのはてブ数を取得するサンプル wp_remote_get
     */
    $url = 'http://google.com';
    $hatena = wp_remote_get( 'http://api.b.st-hatena.com/entry.count?url=' . $url );
    // エラー振り分け
    if ( ! is_wp_error( $hatena ) && $hatena['response']['code'] === 200 ) {
    	echo $hatena['body']; // はてブ数
    } else {
    	// エラー時の処理
    }
    ?>
    <!-- 配列ごと出力 -->
    <pre><?php print_r( $hatena ); ?></pre>

    っという感じで使える、と。

     

    ホホまとめ

    プラグインを作りながら関数を調べながら…ってやっていると知らないことだらけで下書きが増えまくりです。

    調べてやってみて、さらに記事にする、という手順を踏むと間違いなく身についてるなぁと実感しています。