カテゴリー: Web制作・プログラミング

実際の制作現場で役に立つ、技術的な話がメイン。

  • Webエンジニアでもスマホアプリは作れる!そう、Ionicを使えばね。

    Webエンジニアでもスマホアプリは作れる!そう、Ionicを使えばね。

    IT業界に入ってからずっとWeb制作にしか携わっていなかったため、iOSやAndroidのアプリ開発というジャンルを敬遠していました。HTML/CSS、JavaScript、PHPしか知らないので、「アプリ開発とか、よくわからん言語使うんやろ?ハードル高いわー」と思ってました。

    SPA(シングルページアプリケーション)についても思い違いをしていて、なんでわざわざWebアプリ作るのにそんなややこしいことせなあかんのやろとか思ってたんですが、そうじゃないんですね…

    告白します。HTMLでアプリが作れるということを初めて知りました。

    SPAはそのための技術だったんですね。Webアプリケーションを作るだけのためではなかったんです…HTMLでアプリを作れるなんて知らなかったので、先入観が邪魔をしていました。

    これからは、SPA、そしてHTML5アプリについても知見を広げていきます。一気に世界が広がった気分ですね。




    なんで急にそんなことを知ったのか

    僕は今、脱受託に向けてWebサービス開発について勉強をしています。

    完全受託からの脱却~ストック型ビジネスを進めるために必要な方向転換

    Webサービスについていろいろ情報収集をしている中、とある記事で「HTMLでアプリを作れるフレームワーク”Ionic”」の紹介がされていました。

    アプリ開発はハードルが高いと思っていた僕にとって、この情報は

    というほかありませんでした…

    それもそのはず、一般ユーザー向けのWebサービスはブラウザではなくアプリの時代だということはわかっていたのに、Web制作用言語しか知らない僕は、アプリ開発という道を諦めていたのです…

    それが、Ionicを知ったおかげ、というよりHTMLでアプリが作れるという事実を知ったおかげで、可能性がぐんと広がったわけですね。ここから俺の未来は始まるんだというテンションです。

     

    Ionicとは

    ここから先は、Ionicという存在を知り即行で買った以下の本を参考にIonicの基本をまとめます。

    Ionicとは、AngularをベースにしたHTML5アプリ開発用フレームワークで、これ一つでiOS/Androidはもちろん、Webアプリとしてもリリースできます。同時に開発を行えるんですね。

    また、SPA開発パッケージや、PWAも標準でサポートしています。さらに、スマホアプリに変換する機能も搭載されています。

    要するに「いろんな手間が大きく省ける」というわけです。アプリ開発のハードルがかなり下がりますね。



    開発環境の準備(Windows)

    Ionicでアプリ開発を行うため、まずは開発環境の準備を行うため、ソフト・ツールをインストールします。とりあえず必要なのは以下5点。

    • Node.js
    • Ionic CLI
    • Git
    • 実機確認用ツール
    • エディタ

    Node.jsとGitはエンジニアであればインストールされていることが多いと思いますが、インストールされていない場合はこの際にインストールしちゃいましょう。

    Node.js

    Ionicをインストールする前に、Node.jsをインストールします。

    Node.js公式サイト

    インストールできたら、念のため確認します。Node.jsがないと、次のIonic CLIがインストールできません。

    node -v

     

    Ionic CLI

    続いて、Ionicを使うためのIonic CLIをインストールします。

    npm install ionic cordava -g

     

    Git

    こちらも公式サイトからインストール。

    Git公式サイト

    そして確認。

    git --version

     

    実機確認用ツール

    AndroidかiOSかでインストールするツールが違います。

    iOS…Xcode
    Android…Android Studio

    Android Studioのキャプチャ

    いよいよアプリ開発するぞ!って雰囲気になってきましたね~。

    実際に実機でも確認できる

    “Ionic DevApp”というアプリをスマホにインストールしていれば、スマホ実機でも開発中のアプリが簡単に確認できます。

     

    エディタ

    僕はVidual Studio Codeを使っていますが、書籍では「WebStorm」というエディタが紹介されており、気になりました。JavaScriptを使うならこれ!という感じのエディタみたいですが、僕は本業がWeb制作なので…ちょっともったいないかなと思います。そのうち買うのかなーうーん…保留!

    VS Codeを使う場合は、拡張機能「Angular Language Service」をインストールしましょう。

     

    Ionicの便利機能

    Ionicには、HTML5アプリ開発のために多くの便利な機能があります(原文ママ)

    プロジェクト作成が一瞬

    コマンドプロンプトでプロジェクトを作りたいディレクトリに移動

    cd hoge

    そして次のコマンドを打つ

    ionic start

    これだけです!ひぇ~

    面倒な下準備等一切必要なし!

     

    設定も全自動

    プロジェクトのあるディレクトリ内で、以下のコマンドを打つだけ

    ionic serve

    これだけで、webpackというビルドツールが立ち上がり以下の処理が勝手に行われます

    1. 前回ビルドしたファイルが削除される。
    2. 「src/assets」に入れた公開ファイルを「www/assets」にコピー
    3. URLルーティングが有効になる
    4. SCSSとTypeScriptをコンパイルし、1ファイルにまとめる。
    5. 開発用サーバプレビューを起動する。

    うーん至れり尽くせり…

     

    各デバイスごとのデザインプレビューが同時にできる

    サーバプレビューのURLの末尾に”/ionic-lab”を追加すると、Ionic Labというページが立ち上がり、以下のように各ブラウザでの表示が全部確認できます。

    めっちゃええやん…

    各端末向けのUIがデフォルトで最適化されてるってのが高まりますね!

     

    おわり

    今回は僕の夢が一気に広がるきっかけとなったIonicの紹介ということで、いつになくテンション高めでお送りしました。

    これからは、というかもうとっくに「アプリ時代」であって、さらにHTML5アプリが従来のネイティブアプリの市場を上回る勢いらしいので、開発のハードルが低くなったことで可能性が広がりワクワクしますね!

     

    それでは、良いエンジニアライフを!

  • WordPress functions.phpを関数ごとに分割して管理しやすくする話

    WordPress functions.phpを関数ごとに分割して管理しやすくする話

    現在はWordPressを使用してのWebサイト制作の需要が高く、小~中規模のコーポレートサイトをWordPressのオリジナルテーマでCMS化するといった案件が多くあります。

    僕が得意なのはこの分野で、何十件ものサイトのWordPressオリジナルテーマを作ってきました。

     

    その中で、やはりだいたいどのサイトでも使うコードというものが存在していて、これを毎回「あれ、どうすんだっけ…」と調べて書くのは非常に効率が悪いしめんどくさいです。

    そんなときは、テンプレート内やfunctions.phpに全てのコードを書くのではなく、関数を作って関数ごとにphpファイルを作って管理することで、以降同じような処理を書くときにぐっと時間が短くなります。

     

    今回は、僕が普段行っているファイルの管理方法を紹介します。




    テーマの雛形を作る

    プログラミングの時短のコツは、なんといっても「最低限必要なソースがあらかじめ用意されている」ということが基本になります。

    bootstrapやLaravelなどのフレームワークと呼ばれるものも原理は同じです。ただ、これらは「人様が用意してくれたフレームワーク」なので、学習に時間がかかる、拡張しづらい、自由が利かないなどのデメリットがあります。

    ただ、チームでの開発のときに、マニュアルが用意されているため自分以外の人が全く何を書いてあるかわからないといった状況にならないため、主に大規模な開発を行ったり、デザインの段階からフレームワークを用いることを前提としているのであれば非常に便利ですが、逆に小規模だけどデザイン性を重視していて、小回りが利いたほうがいいという状態のときは使いづらいです。

     

    そこで、「人様が作ったフレームワーク」ではなく、「自分のために、自分で作る、自分のためのフレームワーク」を作っていこうぜというわけです。

    拡張性に優れている雛形ができれば、サイトを作れば作るほどどんどん使い勝手がよくなっていきます。最初は数時間かかっていた作業も、雛形があれば数分で終わります

     

    WordPressテーマの雛形の例

    ここで僕の雛形をざっと紹介します。

    こんな感じ。

    themeというフォルダ内にテーマファイルを保管していて、WordPressサイトを作るときはこのthemeフォルダごとコピペしてフォルダ名を変更、あとはstyle.cssの中のテーマ名を変更すればテーマの基本は完成。あっというまですね。

    custumizerフォルダはテーマカスタマイザーという機能を使うのに必要なソース、
    tplフォルダは、各ページ共通で読み込まれるテンプレート(ナビとか)
    functionsフォルダはfunctions.phpに書くところの関数を、関数ごとにファイルにして分けてます。

    functions



    なんでfunctions.phpを分ける必要があるの?

    ひとえに、管理、拡張のしやすさが理由です。

    例えば、title.phpとcategory_list.phpの中身を見てみましょう。

    <?php
    /**
    * タイトル文字数制限
    *
    * @param integer $limit 表示させる文字数。引数を指定しない場合は20
    */
    function show_limit_title($limit = 20) {
      global $post;
      $title = $post->post_title;
      
      if( mb_strlen( $title ) > $limit) {
        $title= mb_substr( $title , 0 , $limit ) ;
        $show_title = $title. ・・・ ;
      } else {
        $show_title = $title;
      }
    
      echo $show_title;
    }
    <?php
    /**
    * 一覧とか詳細にその記事のカテゴリーを表示させるやつ
    *
    * @param string $delimiter 区切り文字を指定できる。引数を指定しない場合は区切り文字なし。
    */
    function show_category( $delimiter = null ) {
      $cats = get_the_category();
      $tmp = $cats;
    
      if( !$cats ) {
        return false;
      }
      
      foreach( $cats as $cat) {
        $cat_id = $cat->term_id;
        $cat_link = get_category_link( $cat_id );
        
        // 出力部分
        echo '<a href="' .$cat_link. '">' .$cat->name. '</a>';
        if( $delimiter && next($tmp) ) {
          echo $delimiter;
        }
      }
    }

    各関数については以下の記事で紹介しています。

    WordPress – タイトルの文字数制限を、関数を作っていい感じにやる

    WordPress – その記事が属するカテゴリーの一覧を表示させる関数

    関数ごとにファイルを分け、それぞれの関数にドキュメントで説明を加えています。ドキュメントはWordPressの規約にのっとっているつもりですが、もしできてなかったらごめんなさい。

     

    今のとこ紹介したのは2つですが、これが10個とか20個になったらfunctions.phpどうなると思いますか?どこに何が書いてあるか探すのも時間かかるし、拡張するのも大変になってきます。

    関数ごとにファイルを分けてやることで、拡張したいときは各ファイルを触ればいいし、関数を追加したいときはファイルを追加すればいいだけです。シンプルでわかりやすいですね。

     

    ちなみにこのブログ書いてて思ったんですが、関数の名前とファイル名を一緒にしたほうがもっとわかりやすいですよね。まだまだ修行が足りてませんでした

     

    functions.phpの書き方

    functions.phpの中身は非常にシンプル。

    <?php
    /**
    * Add Theme Supports
    * WordPressのテーマ拡張機能の有効化
    */
    // add_theme_support('menus'); // メニュー機能
    // add_theme_support('post-thumbnails'); // サムネイル機能
    
    
    /** 
    * Include Functions
    * いろんな関数を個々に読み込む
    * いらないものはできればコメントアウトしておきたい
    * 使わないのに入れておくと邪魔なものは最初からコメントアウトしてある
    */
    get_template_part('functions/editor'); // エディターに関するカスタマイズ
    // get_template_part('functions/menu'); //メニュー機能のカスタマイズ用
    get_template_part('functions/mobile'); // スマホ分岐
    get_template_part('functions/short_code'); // ショートコード集
    // get_template_part('functions/widgets'); // ウィジェットの設定
    get_template_part('functions/category_list'); // カテゴリー表示させたりする
    get_template_part('functions/new'); // Newマーク
    get_template_part('functions/pagenation'); // ページネーション
    // get_template_part('functions/thumbnails'); // サムネイルのあれこれ
    get_template_part('functions/title'); // タイトルの文字数制限
    get_template_part('functions/body_class'); // bodyのclassの表示
    
    
    /** 
    * Theme Customizer
    * テーマカスタマイザーを使うときに。
    */
    // get_template_part('customizer/customize'); // カスタマイザーの記述はここ
    // get_template_part('customizer/style'); // 色を変えたりするときのstyleの記述
    // get_template_part('customizer/customizer-repeater/functions'); // repeaterのプラグイン
    // get_template_part('customizer/repeater'); // repeaterのカスタマイズ
    

     

    こんな感じで、各phpファイルをget_template_part();という関数を使って呼び出し、使わない関数はコメントアウトしているだけ。

    get_template_part();については公式Codexをどうぞ。

     

    おわり

    今回は、WordPressテーマ開発の効率化のため、テーマの雛形作りとfunctions.phpの分け方について紹介しました。

    雛形を作るときは苦労するんですが、慣れれば拡張もさくさくいけるようになるし、自分で自分のためになるツールを育てるというのはすごく楽しいです。

     

    同じような作業を繰り返し行う場合は、その作業をいかに短縮するかというのは我々エンジニアの重要なテーマです。

    それでは、良いエンジニアライフを。

  • WordPress プラグインでできる最低限のSEO【インデックス促進】

    WordPress プラグインでできる最低限のSEO【インデックス促進】

    昔から人々を夢中にさせてやまないSEO(検索エンジン最適化)ですが、Googleの技術の進歩により、最近ではコンテンツSEOが大事だよという認識がようやく浸透してきたように思えます。

    しかし、だからといって技術SEOをないがしろにしていいわけではありません。

    コンテンツSEOがユーザーにとって有益な情報を与えるということであれば、技術SEOはGoogleがページ内容を正しく認識できるようにするという意味合いが強いです。

     

    今回は、その技術SEOの中でも僕が特に重要だと思うクロールにフォーカスを当て、正しく迅速にクロールを行ってもらうために使える、WordPressのプラグインの紹介をしたいと思います。

     

    本記事の構成は以下のとおりです

    1.クロールとインデックスについて
    1-1.クロールとは
    1-2.インデックスとは
    2.Search Consoleについて
    2-1.Search Consoleでできること
    2-2.All in One SEO Packの使い道
    2-3.Search Consoleへの登録
    2-4.サイトマップの送信
    2-5.Fetch as GoogleとWebSub(PubSubHubbub)

    それでは順に見ていきましょう。




    クロールとインデックスについて

    クロールはSEOにとって特に大事と冒頭で説明しましたが、なぜなのか、そもそもクロールってなんやねんという話から。

    クロールとは

    Google公式ガイドラインでは、クロールについて以下のように説明されています。

    新しいウェブページや更新されたウェブページを検出するプロセスのことです。Google はリンクをたどる、サイトマップを読み込むなど、さまざまな手段で URL を検出します。Google はウェブをクロールして新しいページを検出し、(該当する場合は)そのページをインデックスに登録します。

    新しいサイトを立ち上げたり、新しい記事を公開したとき、その時点ではまだ検索に載りませんよね。これはなぜかというと、Googleにクロールされていないためです。

    Googleはクローラ(Googlebotと名付けられています)という自動プログラムを使い、ウェブ上に公開されたサイト/ページをクロールしようと日夜活動を続けていますが、基本的にとんでもない数のサイトが日々更新し続けられているため、公開してすぐのサイトに速攻でクロールしに来てくれることはまずありません。

    クロールされなければまだGoogleに認識すらしてもらえていない状況というわけです。これが、公開した記事がすぐに検索に載らない理由です。

     

    インデックスとは

    こちらもガイドラインより引用

    Google は認識したすべてのウェブページを「インデックス」に格納します。各ページのインデックス エントリにはそのページのコンテンツと場所(URL)が記述されています。「インデックスに登録する」とは、Google があるページを取得し、そのページを読み込んで、インデックスに追加することを指します。例文: 「今日、私のサイトの一部のページが Google のインデックスに登録されました。」

    クロールされたページはGoogleによって構造を理解され、インデックスと呼ばれるデータベースに格納されます。この流れはもはや「インデックスされる」という動詞になってしまってますが、正確には「インデックスに登録される」が正しいんですね。

    ユーザーが検索を行うと、このインデックスから、ユーザーが検索した語句に対し最も有益な情報が書かれているであろうページが検索結果に出されるわけです。

     

    以上、クロールとインデックスについてざっくり説明しました。なぜSEOにおいてクロールが重要かおわかりいただけましたでしょうか。

    そもそも、クロールされてインデックスに登録されなければ検索に載らないということですね。

     

    極端な話、例えば速報系の情報を扱っているブログであれば、「速報!台風が明日上陸する!」というタイトルの記事を書いても、検索に載るのが3日後とかだったらまったく意味ないですよね。

    というわけで、以降はこのクロールを促すという点に絞って、その方法と使用するプラグインを説明していきます。



    Search Consoleについて

    Search Consoleとは、Googleで提供しているツールの1つで、サイトを登録することでSEO上重要な様々な恩恵を受けることができます。以前は「ウェブマスターツール」という名前だったんですが、Search Consoleに変わりました。無料で使えます。

    SEOを意識するのであれば、Search Consoleにサイトを登録しないと話になりません

    前述したクロールの促進のためにも重要なので、Search Consoleについて少し説明させていただきます。

     

    Search Consoleでできること

    Search Consoleに登録すると、以下のようなことができるようになります。

    • クロールの促進(Fetch as Google、サイトマップ)
    • 検索アナリティクス
    • サイト上のエラーの通知、改善
    • スパム被害やペナルティの通知、改善
    • セキュリティの問題の通知、改善

    その他にも機能はありますが、SEO上特に重要なのはこのあたりかと思います。

    検索アナリティクスとかおもしろいですよね。こんなワードで検索してんのか…ってなります。学びのためにもぜひ見てみてください。

    各種通知については、登録したメールアドレス宛てにメールがきます。スパム判定とかされたら相当やばいので、Googleからのメールはこまめにチェックしましょう。

    今回はこの中でも、クロールの促進方法について詳しく説明していきます。

     

    All in One SEO Packのインストール

    Search Consoleでなんやかんやする前に、まずWordPress側で少し準備をしましょう。

    今回使うプラグインは「All in One SEO Pack」です。ご存知の方は多いかと思われますが、このプラグイン、名前の通りSEOに必要なことはだいたいできます。

    All in One SEO PackをインストールしていればSearch Consoleへの登録もできますので、まずAll in One SEO Packをインストールしましょう。

     

    Search Consoleへの登録

    All in One SEO Packをインストールしたら、一般設定の中に「ウェブマスター認証」という項目がありますので、そこにSearch Consoleの認証コードを入力します。

    これだけでSearch Consoleとの連携は完了です。Search Consoleでサイトが正常に登録されたかを確認しましょう。

     

    さらに、All in One SEO PackではGoogle Analyticsも設定できます。

    Search ConsoleとGoogle Analytics両方に登録したら、今回のメインテーマはクロールの促進なので、ひとまず他の設定はあとまわし。

     

    サイトマップの送信

    次は、Search Consoleで自サイトのサイトマップを送信します。

    サイトマップを送信することで、Googlebotくんはサイトの構造を把握しやすくなります。また、どこからもリンクされていないページをクロールするのにも使われます。

     

    サイトマップを送信するにはまずサイトマップを作らないといけないんですが、All in One SEO Packなら拡張機能でサイトマップを作れるうえ、記事が更新されるたびにサイトマップも自動で書き換わり、さらに自動で送信してくれます

    これは使わない手はないです。人によってはGoogle XML Sitemapというプラグインを使う人もいるようですが、プラグイン1個で済むならプラグイン同士の競合が発生することもないし、All in One SEO Packではサイトップ生成についても細かく設定ができて便利です。

     

    拡張機能を有効にする

    All in One SEO Packの「機能管理」を選択し、その中の「XMLサイトマップ」を有効にします。

    サイトマップの設定はほとんどそのままでいいと思うんですが、僕は下記2点に注意しています。

    更新を予約

    サイトマップを更新し、Googleにサイトマップを送信するスケジュールです。記事を更新する頻度に合わせて設定します。

    投稿タイプ

    All in One SEO Packの一般設定でnofollowとしているページをここでチェックしていると、Search Consoleでエラーになります。

    サイトマップに書いてるからクロールしようと思ったのに、nofollowって言われて追い返されたんやけど

    ということですね。

     

    サイトマップの生成ができたら、Search Consoleの管理画面からサイトマップを送信します。

     

    フィードの送信

    サイトマップの他にも、フィードの送信をすることも可能です。

    これは僕も最近はじめて知りました。

    サイトマップはサイトの構造をGoogleに伝えるのに対し、フィードを送信することで、更新したページの情報をダイレクトにGoogleに伝えることができます。

    Googleも、サイトマップとは別にフィードの送信をすることを推奨しています。

    自サイトのフィードのURLは、WordPressサイトであればだいたい/feed/となっているはずです。実際にアクセスして確認してみてください。

     

    Fetch as GoogleとWebSub(PubSubHubbub)

    Search Console上からFetch as Googleを行うことで、Googleにクロールを促すことができます

    クロールしてほしいURLを入力し、「取得」をクリック。ちなみに「取得してレンダリング」をクリックすると、Googlebotくんがページをどのように認識しているかを見ることができます。

    「あれ、なんか実際のページと違うんだけど」ということが稀にありますので、たまに見ておきましょう。

    取得すると「インデックス登録をリクエスト」というボタンが出てきますので、迷わず押しましょう。これで、クロールしてもらい、インデックスをやってくださいとお願いするわけです。

     

    WebSub(PubSubHubbub)

    Websub(ちょっと前まではPubSubHubbubという名前でした。長いし覚えにくいしどう考えても浸透しそうにないんで変わったんですかね…)とは、Googlebotくんやフィードリーダーに対し自動的にプッシュ通知を行う機能です。

    上記Fetch as Googleと同じ機能ではあるんですが、記事を作るたびに毎回Fetch as Googleやるんめんどいわーという方は(普通めんどいと思います)この機能を使いましょう。

     

    WordPressを使っている場合、WebSub/PubSubHubbubというプラグインをインストールし、有効化するだけでこの機能を使えます。



    おわり

    これで、クロール対策はばっちりですね。ここまでの作業をしておくことで、記事が更新されてから、Googlebotくんがクロールしてくれるまでの時間がぐっと縮まります。

    えっ、もうインデックスされてる!ってなりますので、ぜひやっておきましょう。

     

    なお、新規にサイトを立ち上げる場合はどこからもリンクされていない状態なので、Googlebotくんがサイトを見つけるのに非常に時間がかかります

    よって、新規サイト立ち上げの際は、Search Console登録からFetch as Googleまでの流れは必須となりますので、覚えておいてください。

     

    ちなみに、本記事に書かれている内容の一部(Websub)は、以下に紹介する本で勉強しました。その他のことは前から知っていたんですが、この本にももちろん書かれています。

    さらに、最近の主流であるコンテンツSEOについても「SEOってそんな大変なの!?」と思うくらいぎっしり細かく書かれていますので、SEOについてガチで勉強したい人はぜひ読んでみてください。

     

    ではでは、良いクロールライフを!

  • wp_head();とwp_footer();とはいったい何なのか

    wp_head();とwp_footer();とはいったい何なのか

    WordPressテーマ開発をやり始めたころ、「header.phpにはwp_head();を、footer.phpにはwp_footer();を必ず書いてください」と言われ、意味もよくわからず「とりあえずこれ書いとかんと動かんのやな」くらいのイメージでいましたが、書かなければ動かないということは当然これらは重要な役割を持っているからなのです。

     

    よく「なんで動かんのやろ…」と原因不明の不具合に悩まされているとき、wp_head();かwp_footer();のどっちかがないということがたまにありますが、この方々はとんでもなく重要な役割を持っていることを知れば、書き忘れることも少なくなるでしょう。

    むしろ愛着すら持つようになるかもしれません。

     

    というわけで、今回はwp_head();とwp_footer();がいったい何なのかを徹底解説したいと思います。




    wp_head();とは

    WordPress Codexでは、wp_head();について以下のように説明されています。

    ‘wp_head’ アクションをスタートさせる。テーマテンプレートファイル内の</head>タグ直前で使う(例: header.php や index.php の中)。

    全然意味がわかりません。とりあえず</head>の直前に入れたほうがいいということだけは伝わります。

    これでは結局なんやねんってなってしまうので、実際にテンプレートにwp_head();を入れて、サイト上でどのようになっているのか確認してみましょう。

    <!DOCTYPE html>
    <html lang="ja">
    <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title><?php wp_title( '|', true, 'right' ); bloginfo('name');?></title>
    <link rel="stylesheet" href="<?php bloginfo( 'stylesheet_url' ); ?>" type="text/css" />
    <?php wp_head(); ?>
    </head>

    ↓ブラウザ上で見てみると…

    <!DOCTYPE html>
    <html lang="ja">
    <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>テスト</title>
    <link rel="stylesheet" href="http://localhost/nomou/htdocs/wp-content/themes/sample/style.css" type="text/css" />
    <meta name='robots' content='noindex,follow' />
    <link rel='dns-prefetch' href='//s.w.org' />
    		<script type="text/javascript">
    			window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/2.4\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/2.4\/svg\/","svgExt":".svg","source":{"concatemoji":"http:\/\/localhost\/nomou\/htdocs\/wp-includes\/js\/wp-emoji-release.min.js?ver=4.9.6"}};
    			!function(a,b,c){function d(a,b){var c=String.fromCharCode;l.clearRect(0,0,k.width,k.height),l.fillText(c.apply(this,a),0,0);var d=k.toDataURL();l.clearRect(0,0,k.width,k.height),l.fillText(c.apply(this,b),0,0);var e=k.toDataURL();return d===e}function e(a){var b;if(!l||!l.fillText)return!1;switch(l.textBaseline="top",l.font="600 32px Arial",a){case"flag":return!(b=d([55356,56826,55356,56819],[55356,56826,8203,55356,56819]))&&(b=d([55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447],[55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447]),!b);case"emoji":return b=d([55357,56692,8205,9792,65039],[55357,56692,8203,9792,65039]),!b}return!1}function f(a){var c=b.createElement("script");c.src=a,c.defer=c.type="text/javascript",b.getElementsByTagName("head")[0].appendChild(c)}var g,h,i,j,k=b.createElement("canvas"),l=k.getContext&&k.getContext("2d");for(j=Array("flag","emoji"),c.supports={everything:!0,everythingExceptFlag:!0},i=0;i<j.length;i++)c.supports[j[i]]=e(j[i]),c.supports.everything=c.supports.everything&&c.supports[j[i]],"flag"!==j[i]&&(c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&c.supports[j[i]]);c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&!c.supports.flag,c.DOMReady=!1,c.readyCallback=function(){c.DOMReady=!0},c.supports.everything||(h=function(){c.readyCallback()},b.addEventListener?(b.addEventListener("DOMContentLoaded",h,!1),a.addEventListener("load",h,!1)):(a.attachEvent("onload",h),b.attachEvent("onreadystatechange",function(){"complete"===b.readyState&&c.readyCallback()})),g=c.source||{},g.concatemoji?f(g.concatemoji):g.wpemoji&&g.twemoji&&(f(g.twemoji),f(g.wpemoji)))}(window,document,window._wpemojiSettings);
    		</script>
    		<style type="text/css">
    img.wp-smiley,
    img.emoji {
    	display: inline !important;
    	border: none !important;
    	box-shadow: none !important;
    	height: 1em !important;
    	width: 1em !important;
    	margin: 0 .07em !important;
    	vertical-align: -0.1em !important;
    	background: none !important;
    	padding: 0 !important;
    }
    </style>
    <link rel='stylesheet' id='dashicons-css'  href='http://localhost/nomou/htdocs/wp-includes/css/dashicons.min.css?ver=4.9.6' type='text/css' media='all' />
    <link rel='stylesheet' id='admin-bar-css'  href='http://localhost/nomou/htdocs/wp-includes/css/admin-bar.min.css?ver=4.9.6' type='text/css' media='all' />
    <link rel='https://api.w.org/' href='http://localhost/nomou/htdocs/wp-json/' />
    <link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://localhost/nomou/htdocs/xmlrpc.php?rsd" />
    <link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://localhost/nomou/htdocs/wp-includes/wlwmanifest.xml" /> 
    <meta name="generator" content="WordPress 4.9.6" />
    <link rel="canonical" href="http://localhost/nomou/htdocs/" />
    <link rel='shortlink' href='http://localhost/nomou/htdocs/' />
    <link rel="alternate" type="application/json+oembed" href="http://localhost/nomou/htdocs/wp-json/oembed/1.0/embed?url=http%3A%2F%2Flocalhost%2Fnomou%2Fhtdocs%2F" />
    <link rel="alternate" type="text/xml+oembed" href="http://localhost/nomou/htdocs/wp-json/oembed/1.0/embed?url=http%3A%2F%2Flocalhost%2Fnomou%2Fhtdocs%2F&#038;format=xml" />
    <style type="text/css" media="print">#wpadminbar { display:none; }</style>
    <style type="text/css" media="screen">
    	html { margin-top: 32px !important; }
    	* html body { margin-top: 32px !important; }
    	@media screen and ( max-width: 782px ) {
    		html { margin-top: 46px !important; }
    		* html body { margin-top: 46px !important; }
    	}
    </style>
    </head>
    

    うわーっ!なんかいっぱい増えてる!

    <meta name=’robots’ content=’noindex,follow’ />

    以降は全部wp_head();によって出力されているんですね。

     

    そう、wp_head();とは、WordPressさんサイドで用意してくれるhtmlをhead内に出力してくれる関数なんです。

    例えばそこには、All in one SEO Pack等のプラグインで設定したmeta情報や、プラグイン固有のスタイルシート、javascriptファイルなんかも出力されることになります。

     

    逆に言えばwp_head();がないと、head内に必要な情報が出力されないということです。

    wp_footer();とは

    これも例によりCodexを見てみましょう。もしかするとわかりやすい説明が…

    ‘wp_footer’ アクションフックをスタートさせる。テーマテンプレートファイル内の </body> タグ直前で使う(例: footer.php や index.php の中)。

    うん、そうだと思った。

     

    wp_footer();も、働きとしてはwp_head();と同じです。</body>直前に、ページの最後に読み込まれるべきスクリプトなんかが出力されるわけですね。見てみましょう

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

    ↓ブラウザ上で見ると…

    <script type='text/javascript' src='http://localhost/nomou/htdocs/wp-includes/js/admin-bar.min.js?ver=4.9.6'></script>
    <script type='text/javascript' src='http://localhost/nomou/htdocs/wp-includes/js/wp-embed.min.js?ver=4.9.6'></script>
    	<!--[if lte IE 8]>
    		<script type="text/javascript">
    			document.body.className = document.body.className.replace( /(^|\s)(no-)?customize-support(?=\s|$)/, '' ) + ' no-customize-support';
    		</script>
    	<![endif]-->
    	<!--[if gte IE 9]><!-->
    		<script type="text/javascript">
    			(function() {
    				var request, b = document.body, c = 'className', cs = 'customize-support', rcs = new RegExp('(^|\\s+)(no-)?'+cs+'(\\s+|$)');
    
    						request = true;
    		
    				b[c] = b[c].replace( rcs, ' ' );
    				// The customizer requires postMessage and CORS (if the site is cross domain)
    				b[c] += ( window.postMessage && request ? ' ' : ' no-' ) + cs;
    			}());
    		</script>
    	<!--<![endif]-->
    			<div id="wpadminbar" class="nojq nojs">
    							<a class="screen-reader-shortcut" href="#wp-toolbar" tabindex="1">ツールバーへスキップ</a>
    						<div class="quicklinks" id="wp-toolbar" role="navigation" aria-label="ツールバー" tabindex="0">
    				<ul id="wp-admin-bar-root-default" class="ab-top-menu">
    		<li id="wp-admin-bar-wp-logo" class="menupop"><a class="ab-item" aria-haspopup="true" href="http://localhost/nomou/htdocs/wp-admin/about.php"><span class="ab-icon"></span><span class="screen-reader-text">WordPress について</span></a><div class="ab-sub-wrapper"><ul id="wp-admin-bar-wp-logo-default" class="ab-submenu">
    		<li id="wp-admin-bar-about"><a class="ab-item" href="http://localhost/nomou/htdocs/wp-admin/about.php">WordPress について</a>		</li></ul><ul id="wp-admin-bar-wp-logo-external" class="ab-sub-secondary ab-submenu">
    		<li id="wp-admin-bar-wporg"><a class="ab-item" href="https://ja.wordpress.org/">WordPress.org</a>		</li>
    		<li id="wp-admin-bar-documentation"><a class="ab-item" href="http://wpdocs.osdn.jp/">ドキュメンテーション</a>		</li>
    		<li id="wp-admin-bar-support-forums"><a class="ab-item" href="https://ja.wordpress.org/support/">サポートフォーラム</a>		</li>
    		<li id="wp-admin-bar-feedback"><a class="ab-item" href="https://ja.wordpress.org/support/forum/feedback/">フィードバック</a>		</li></ul></div>		</li>
    		<li id="wp-admin-bar-site-name" class="menupop"><a class="ab-item" aria-haspopup="true" href="http://localhost/nomou/htdocs/wp-admin/">テスト</a><div class="ab-sub-wrapper"><ul id="wp-admin-bar-site-name-default" class="ab-submenu">
    		<li id="wp-admin-bar-dashboard"><a class="ab-item" href="http://localhost/nomou/htdocs/wp-admin/">ダッシュボード</a>		</li></ul><ul id="wp-admin-bar-appearance" class="ab-submenu">
    		<li id="wp-admin-bar-themes"><a class="ab-item" href="http://localhost/nomou/htdocs/wp-admin/themes.php">テーマ</a>		</li></ul></div>		</li>
    		<li id="wp-admin-bar-customize" class="hide-if-no-customize"><a class="ab-item" href="http://localhost/nomou/htdocs/wp-admin/customize.php?url=http%3A%2F%2Flocalhost%2Fnomou%2Fhtdocs%2F">カスタマイズ</a>		</li>
    		<li id="wp-admin-bar-updates"><a class="ab-item" href="http://localhost/nomou/htdocs/wp-admin/update-core.php" title="2件のプラグイン更新, 翻訳の更新"><span class="ab-icon"></span><span class="ab-label">3</span><span class="screen-reader-text">2件のプラグイン更新, 翻訳の更新</span></a>		</li>
    		<li id="wp-admin-bar-comments"><a class="ab-item" href="http://localhost/nomou/htdocs/wp-admin/edit-comments.php"><span class="ab-icon"></span><span class="ab-label awaiting-mod pending-count count-0" aria-hidden="true">0</span><span class="screen-reader-text">0件のコメントが承認待ちです。</span></a>		</li>
    		<li id="wp-admin-bar-new-content" class="menupop"><a class="ab-item" aria-haspopup="true" href="http://localhost/nomou/htdocs/wp-admin/post-new.php"><span class="ab-icon"></span><span class="ab-label">新規</span></a><div class="ab-sub-wrapper"><ul id="wp-admin-bar-new-content-default" class="ab-submenu">
    		<li id="wp-admin-bar-new-post"><a class="ab-item" href="http://localhost/nomou/htdocs/wp-admin/post-new.php">投稿</a>		</li>
    		<li id="wp-admin-bar-new-media"><a class="ab-item" href="http://localhost/nomou/htdocs/wp-admin/media-new.php">メディア</a>		</li>
    		<li id="wp-admin-bar-new-page"><a class="ab-item" href="http://localhost/nomou/htdocs/wp-admin/post-new.php?post_type=page">固定ページ</a>		</li>
    		<li id="wp-admin-bar-new-shop"><a class="ab-item" href="http://localhost/nomou/htdocs/wp-admin/post-new.php?post_type=shop">店舗情報</a>		</li>
    		<li id="wp-admin-bar-new-user"><a class="ab-item" href="http://localhost/nomou/htdocs/wp-admin/user-new.php">ユーザー</a>		</li></ul></div>		</li>
    		<li id="wp-admin-bar-edit"><a class="ab-item" href="http://localhost/nomou/htdocs/wp-admin/post.php?post=11&#038;action=edit">固定ページを編集</a>		</li></ul><ul id="wp-admin-bar-top-secondary" class="ab-top-secondary ab-top-menu">
    		<li id="wp-admin-bar-search" class="admin-bar-search"><div class="ab-item ab-empty-item" tabindex="-1"><form action="http://localhost/nomou/htdocs/" method="get" id="adminbarsearch"><input class="adminbar-input" name="s" id="adminbar-search" type="text" value="" maxlength="150" /><label for="adminbar-search" class="screen-reader-text">検索</label><input type="submit" class="adminbar-button" value="検索"/></form></div>		</li>
    		<li id="wp-admin-bar-my-account" class="menupop with-avatar"><a class="ab-item" aria-haspopup="true" href="http://localhost/nomou/htdocs/wp-admin/profile.php">こんにちは、<span class="display-name">root</span> さん<img alt='' src='http://1.gravatar.com/avatar/d01ced56814ff772907fb3f10654240e?s=26&#038;d=mm&#038;r=g' srcset='http://1.gravatar.com/avatar/d01ced56814ff772907fb3f10654240e?s=52&#038;d=mm&#038;r=g 2x' class='avatar avatar-26 photo' height='26' width='26' /></a><div class="ab-sub-wrapper"><ul id="wp-admin-bar-user-actions" class="ab-submenu">
    		<li id="wp-admin-bar-user-info"><a class="ab-item" tabindex="-1" href="http://localhost/nomou/htdocs/wp-admin/profile.php"><img alt='' src='http://1.gravatar.com/avatar/d01ced56814ff772907fb3f10654240e?s=64&#038;d=mm&#038;r=g' srcset='http://1.gravatar.com/avatar/d01ced56814ff772907fb3f10654240e?s=128&#038;d=mm&#038;r=g 2x' class='avatar avatar-64 photo' height='64' width='64' /><span class='display-name'>root</span></a>		</li>
    		<li id="wp-admin-bar-edit-profile"><a class="ab-item" href="http://localhost/nomou/htdocs/wp-admin/profile.php">プロフィールを編集</a>		</li>
    		<li id="wp-admin-bar-logout"><a class="ab-item" href="http://localhost/nomou/htdocs/wp-login.php?action=logout&#038;_wpnonce=775107e931">ログアウト</a>		</li></ul></div>		</li></ul>			</div>
    						<a class="screen-reader-shortcut" href="http://localhost/nomou/htdocs/wp-login.php?action=logout&#038;_wpnonce=775107e931">ログアウト</a>
    					</div>
    
    		</body>
    </html>
    

    これまたすごい量のコードが出力されています。

    ここにはページの最後に読み込むスクリプトに加え、ログインしているときにサイト上部に表示される管理バーのコードも出力されます

    なので、wp_footer();がないと一部のスクリプトが読み込まれずエラーになったり。管理バーが表示されません。

     

    おわり

    wp_head();とwp_footer();の重要さがご理解いただけたかと思います。この方々がいないと、ページはまともに機能しません。

    以後、書き忘れのないよう注意しましょう。

    本記事の基礎的なことを含め、マッハでWordPressについてプロ並みのスキルを身につけたいなら、TechAcademyのWordPressコース等、プログラミングスクールで学ぶのが手っ取り早いです。

    最短4週間でオリジナルテーマを作れるようになりますので、ホームページを作りたいけど外注に出すと高いから自社で作りたい方や、WordPress構築の仕事を請けたい方はぜひ検討してみてください。

    WordPressでWebサイトを構築するのに便利なプラグインを以下の記事で紹介しているので、ついでにどうぞ。

    WordPress構築で使える、カスタマイズに便利なプラグイン11個

    それじゃ、バイバイ~

     

  • スマホのときだけ電話番号をリンクにしたいときのCSS小技

    スマホのときだけ電話番号をリンクにしたいときのCSS小技




    電話番号をタップしたら電話できるようになる

    <a href="tel:0000000000">0000000000</a>

    これですが、そのままだとPCでもクリックできちゃう。

     

    実はSkypeとか入れてたら普通に電話できるから別にクリックできてもいいんだけど、あんまりスタンダードではないので、基本はクリックできないほうがいい。

    そんなとき便利なのが、

    pointer-events: none;

    というプロパティ。これはクリックイベントを無効化にするという奇跡のプロパティで、これを知っていると役に立つ場面が多々ある。

     

    というわけで、スマホ以外では電話番号はタップしても何も起こらないようにしてやればいい。

    @media screen and (min-width: 751px){
      .telLink {
        pointer-events: none;
      }
    }
    <a href="tel:0000000000" class="telLink">0000000000</a>

    telLinkというclass名つけるだけでいけるので、再利用性抜群です。

     

    メディアクエリじゃなくてちゃんとデバイスで判別したい!という場合はjQueryを使いましょう

    .is-eventNone {
      pointer-events: none;
    }
    $(function(){
      if(!navigator.userAgent.match(/(iPhone|iPad|iPod|Android)/)){
        $('.telLink').addClass('is-eventNone');
      }
    });

     

  • jQuery チェックしたラジオボタンの値を、テキストフィールドに反映させる方法

    jQuery チェックしたラジオボタンの値を、テキストフィールドに反映させる方法

    ラジオボタンでチェックさせ、その値を別のテキストフィールドに反映させる方法。

    例えば、メールアドレス入力のときに@以降を選択させることができる。




    <input type="email" name="your-email">
    
    <p>※@以降を以下から選択できます。</p>
    <ul class="addressList">
      <li><label><input type="radio" name="addressSelect" value="" checked>選択なし</label></li>
      <li><label><input type="radio" name="addressSelect" value="@docomo.ne.jp">@docomo.ne.jp</label></li>
      <li><label><input type="radio" name="addressSelect" value="@ezweb.ne.jp">@ezweb.ne.jp</label></li>
      <li><label><input type="radio" name="addressSelect" value="@softbank.ne.jp">@softbank.ne.jp</label></li>
      <li><label><input type="radio" name="addressSelect" value="@yahoo.co.jp">@yahoo.co.jp</label></li>
      <li><label><input type="radio" name="addressSelect" value="@gmail.com">@gmail.com</label></li>
    </ul>
    $(function(){
        var addressSelect = $('input[name="addressSelect"]');
        var yourEmail = $('input[name="your-email"]');
    
        addressSelect.change(function(){
            var selectVal = $(this).val();
            var getAddressData = yourEmail.val();
            var posData = getAddressData.indexOf('@');
            
            if(posData < 0) {
                addressData = getAddressData;
            } else {
                addressData = getAddressData.substring(0,posData);
            }
            yourEmail.val(addressData + selectVal);
        });
    });

     

    8行目の

    var posData = getAddressData.indexOf('@');

    で、テキストフィールド内の@以降の文字列を取得。

    if(posData < 0) {
        addressData = getAddressData;
    } else {
        addressData = getAddressData.substring(0,posData);
    }

    もし@以降に文字列があれば、@までの文字列を取得する。
    @以降に文字列がなければ、全ての文字列を取得する。

    これにより、例えば

    hogehoge@gmail.com

    と既に入力していても、@以降のみを変更することが可能。

     

    そんな処理は必要なく、ただ反映させたいだけであれば上記をまるっと削除し、

    $(function(){
        var addressSelect = $('input[name="addressSelect"]');
        var yourEmail = $('input[name="your-email"]');
    
        addressSelect.change(function(){
            var selectVal = $(this).val();
            var getAddressData = yourEmail.val();
    
            yourEmail.val(getAddressData + selectVal);
        });
    });

    これだけでOK。

    ラジオボタンで値を選択すると、テキストフィールドに入力した値は削除され上書きされる。

  • イベントトラッキングが計測されないときに確認すること

    イベントトラッキングが計測されないときに確認すること

    Google Analyticsで、リンクや電話番号をクリックされたことを計測するためのイベントトラッキング。

    基本、以下のように記載していれば今までは計測できていました。ググっても、紹介されているのはだいたいこの形ですよね。

    <a href="http://hoge.com/" onclick="ga('send','event','カテゴリ','アクション','ラベル');">リンク</a>

    ところが、先日いつも通りの設定方法では計測できていないことがあり、調べて解決したのでメモ。




    Analyticsトラッキングコードを確認

    まずはAnalyticsのトラッキングコードが正常に<head>内に書かれているかを確認しましょう。

    一般的には、だいたい下記のようなコードである場合が多いです

    <script type="text/javascript" >
    	window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
    	ga('create', 'UA-XXXXXX-XX', 'auto');
    	
    	ga('send', 'pageview');
    </script>
    <script async src="https://www.google-analytics.com/analytics.js"></script>
    

    トラッキングコードが正常に動いているかを確認したいときは、Analytics管理画面の「リアルタイムレポート」を見れば一瞬でわかります。

    もし理由あってAnalytics管理画面に入れない場合は、Chromeの拡張機能Tag Assistantで確認してみましょう。

     

    ところが、問題のサイトのトラッキングコードはちょっと違ったんです。

    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-XXXXXX-XX"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
    
      gtag('config', 'UA-XXXXXX-XX');
    </script>

    Global site tagと書かれているのが確認できるかと思います。

     

    Global site tag(グローバルサイトタグ)とは?

    これはどういうことかというと、最近またGoogle Analyticsの計測タグが新しくなり、このGlobal site tag(グローバルサイトタグ)というものが使われるようになったんです。

    なので、今までのタグとはちょっと設定方法が変わります。

     

    グローバルサイトタグでのトラッキングコードは以下の通り

    <a href="http://hoge.com/" onclick="gtag('event', 'アクション', {'event_category': 'カテゴリ','event_label': 'ラベル'});">電話番号</a>

    sendを省略する代わりに、若干ややこしくなってますね。

    ただ、グローバルサイトタグのトラッキングコードには、デフォルトのアナリティクスイベントというものが用意されるようになりました。

     

    デフォルトのアナリティクスイベントとは?

    上記で紹介した書き方は、デフォルトではなく、いわゆる自作のイベントトラッキングコードです。

    デフォルトのアナリティクスイベントは、Googleさんサイドでアクション、カテゴリ、ラベルを用意してくれているイベントトラッキングコードのことを指します。

     

    例えば、以下のような形。

    gtag('event', 'login', { method : 'Google' });

     

    このように書くと、アクション「login」、カテゴリ「engagement」、ラベル「Google」の Google アナリティクス イベントが送信されるということです。

    今のところメリットはイマイチわかりませんが、公式ドキュメントによると

    通常は、デフォルトの Google アナリティクス イベントを使用することをおすすめします。デフォルトのイベントには、デフォルトのカテゴリやラベルがあらかじめ設定されています。これらのイベントを使用することで、レポートの一貫性や将来実装される機能との相互運用性を確保しやすくなります。

    とのことなので、おそらく将来追加される何かしらの機能と連動するようになるんじゃないかと予測されます。

     

    デフォルトのアナリティクスには他にも種類がありますので、下記公式ドキュメントを参考にしてみてください。

    Googleアナリティクス



    おわり

    今までできていたのに、急にできなくなった…という事態が発生した場合、まずはコードの記述にミスがないかを確認するのがベストですが、特に自分の書いたコードにミスがなさそうな場合は、サービス元の仕様に何か変更がないかを確認することが重要です。

    いつの間にか仕様が変更になってること、けっこうありますからね…

     

    アクセス解析やSEO関連の情報は、できるだけ新しいものを参考にしてくださいね!

    それでは、良いアクセス解析を!

  • BackWPupのエラーをようやく解決した話

    BackWPupのエラーをようやく解決した話

    WordPressのバックアップ用プラグインBackWPupをよく使っているんですが、クライアントから自動バックアップでエラーが出るとの連絡が。

     

    ログを見てみるとこんな感じ

    エラー:シグナル”SIGXCPU”(CPUの時間制限を超えました)がスクリプトへ送信されます!とのこと。

     

    だいたいはサーバーのスペック不足が原因だと思うのですが、いろいろ試してみて解決したのでメモ。




    ファイルとデータベースのジョブは分ける

    まず、サーバーへの負担を減らすためにも、ファイルとデータベースのバックアップは分け、それぞれ別のタイミングで自動バックアップをとるよう設定。

    これにより、重要なデータベースのバックアップだけでもとりあえず正常に行えるし、そもそもファイルはそんな頻繁にバックアップとらなくていいと思うので(WordPressはあんまりファイルいじらないため。ローカルに手動で保存もできるし。)、データベースは毎日、ファイルは週一でバックアップをとるようにしました。

     

    しかし、これではエラーは解決できませんでした。次いってみましょう。

     

    最大スクリプト実行時間を設定

    ググると最初に出てきたのがこれ。

    最大スクリプト実行時間を60秒にしてみたらなおったよ~という報告がありましたが、僕の場合はだめでした。



    サーバーの負荷を軽減で解決

    最終的にこれで解決しました。

    サーバーの負荷を軽減が、デフォルトでは無効になっているので、最小にしたところ無事自動バックアップが正常に行われていました。

     

    最大スクリプト実行時間はあまり関係ないかもしれませんが、念のため。

     

    よくわからないサーバーを使っていると、よくわからないエラーに悩まされることが多々あります。サーバーはいいサーバーを使おうね!

    おすすめサーバーは以下で紹介していますので、よかったら見てってくださいね。

    https://meshikui.com/2018/12/03/1396/

    ではでは、良いバックアップライフを。

  • 【WordPress】記事内にテンプレートを挿入するプラグイン”TinyMCE Templates”

    【WordPress】記事内にテンプレートを挿入するプラグイン”TinyMCE Templates”

    複数の記事内に同じ内容、例えば広告だったり、他の記事のリストだったりを挿入したいときに便利なプラグイン”TinyMCE Templates“。




    使い方は簡単で、プラグインをインストールすると管理メニューに「テンプレート」という項目が追加されるため、そこからテンプレートを作成するだけ。

    複数のテンプレートを登録でき、記事内に挿入する際にテンプレートを選択できる。

     

    ショートコードとして挿入

    テンプレートを作成する際、更新ボタンの下に「ショートコードとして挿入」という項目があり、デフォルトは「いいえ」になっている。

    これを「はい」にすると、登録した内容をショートコードで挿入することができるようになる。

    ショートコードとして挿入できると、例えば

    「あ、テンプレート修正せんと。でも全記事やるのめんどくせー」

    ってときに、ショートコードで挿入している場合は、テンプレート編集画面でテンプレートを修正するだけで済む。

    ただし、記事側でテンプレートを編集できないというデメリットがある。

     

    逆に、「いいえ」にするとショートコードではなくテンプレートに書いたhtmlコードをそのまま挿入することになる。

    こちらは記事側でhtmlを編集できるが、修正が必要な場合は全記事なおす必要がある。

     

    ショートコードとして挿入を、

    • 「はい」…全記事に同じテンプレートをいれる必要があり、たびたび修正が発生する可能性がある場合(広告を貼りかえる場合等)
    • 「いいえ」…テンプレートの一部を記事ごとに書き換える必要がある場合。(管理者からのコメントや、URL等)

    このように使い分けるといいだろう。

  • PHP初心者にまず読んでほしい一冊の本

    PHP初心者にまず読んでほしい一冊の本

    駆け出しペチパー(PHPer)のみなさま、こんにちは。

    検索でこの記事を発見して読みに来ていただいたということは、おそらくこれからPHPを勉強してプログラミングができるようになりたい、もしくはなんとなくPHPわかるけど、ちゃんと基礎を学ぼうと思う、そういった意思を心に秘めていることだと思います。

     

    それでは、PHP初心者がまず何をすればいいのか。答えは1つです。

     

    この本を読んでください。

    当記事では、この本(タイトルが長いけど「この本」で通すのもなんなので、以降マスターブックと呼びます)を読んでほしい理由を綴っていますので、どうぞお付き合いください。だいたい5分くらいで読めると思います。

    ちなみに、私もマスターブック持ってます。PHPを使う方であれば、大半は持ってるんじゃないかと思うくらいメジャーで素敵な本なので、知っておいて損はないですよ!




    PHPの本を読むという行為のメリット

    マスターブックを読んでほしいという話の前に、そもそもプログラミング初心者はまず本を読むべきだという話をします。

     

    「PHPの情報を検索して調べる」vs「PHPの本を読む」

    だいたい、プログラミング関係の情報はググれば山ほど記事がありますよね。無料で調べられるし、ネットさえつながっていれば現場でもどこでもその場で調べることができます。

    これに関しては、ネット社会のすばらしさを実感します。とても良いです。

    それでは、いったい何が悪いのか。それは、検索するのは自分であり、基本的に自分の知っている範囲でのワードでしか調べることができないという点です。

    作業中にわからない部分があり、検索して解決するという点に関しては圧倒的メリットがありますが、そもそも自分が知らないことを調べるというのはなかなか難しい傾向にあります。

     

    実は恥ずかしいことに私がそういった経験がありまして、PHPを初めて触ったときからずっと検索だけで2年ほどやってきたんですが、それでもマスターブックに書いてある大半が知らないことでした。「これそういう意味だったの!?そんな便利な関数あったの!?最初に知っときたかったーー」のオンパレードです。

    ネット検索だけで数年がかりで蓄えた知識は、一冊の本を買って数日間で得られる知識に敵わないんですね。

     

    また、ネット上の記事はほとんどが個人が書いたブログです。もちろん法人とか、しっかりした手順で書かれた記事もあるのですが、「いやこれ間違っとるけどちゃんと自分で書いたコードか?」「この記事さっき別のサイトで見たのとほぼ同じやししかも解決せんかったやつや!」ってなることが多々あるのが現実です。

    私のサイトのコードは自分で書いたものだし動作確認も行っているので、たぶんコピペで動くとは思うんですが、それでも確実かと言われると自信がありません。。

    一方、本は違います。いろんな方面のプロが何回もチェックしてますので、間違っているということはほぼほぼないです。信用が違いますね。



    マスターブックを読むメリット

    本を読むという行為自体のメリットを伝えた次は、どうしてこの本を勧めるかを書いていきますね。

     

    マスターブックの内容

    マスターブックは全部でChapter13まであり、下記のような構成になっています。

    1. PHPの開発環境
    2. PHPの基礎
    3. PHPの組み込み関数
    4. WebでのPHP
    5. クラスとオブジェクト
    6. データベースの準備
    7. データ操作の基本
    8. PHPからデータベースを操作する
    9. PHPとMariaDB/MySQLで作る会員管理システム-基本機能
    10. PHPとMariaDB/MySQLで作る会員管理システム-管理機能
    11. データベースの運用
    12. PHPの応用
    13. これからプログラミンぐをしていくにあたって

    どうですか?やばみが伝わりますか?

     

    この本一冊で、PHPの基礎~応用はもちろん、開発環境の構築の話やMySQL(MariaDB)の作成・操作方法、更に会員管理システムを実際に作りながら学べ、挙句の果てにChapter13では自分で設計から考えプログラミングをするためのレクチャーをしてくれます。最後に練習問題もあります。

    もう全部ですよね。まさにPHPマスターブックです。



    マスターブックを読んだあとは

    マスターブックを一通り読み終え、会員管理システムも作ってみたあなたは、もうPHPの基礎はマスターしています。本を読み終えたら、文系美女と観光地にデートでもいきましょう。

    美女なんかより、もっともっとPHPを学びたいストイックなあなたに、基礎の次のステップへの指針をさらっと紹介しておきます。

     

    PHP公式サイトに訪れる

    PHP公式サイトには、言語リファレンスというPHPの辞書があります。

    リンク → 言語リファレンス

    基礎を学ぶ前にこのサイトを見てもいったい何を書いてるのかわからない、わからない部分がわからないという事態に陥ると思いますが、基礎を学んだあとはこのサイトの呪文が読めるようになっているはずです。

    わからないことは公式サイトで調べるようにしましょう。

     

    PHPフレームワークを学ぶ

    フレームワークという言葉を聞きなれない方もいらっしゃるかもしれませんが、簡単にいうと土台です。PHPでシステム開発をするために必要な機能や枠組みがあらかじめ用意されているソフトウェアで、大規模なシステム開発や、ECサイト開発によく使われます。

    WordPressも、フレームワークと捉えることが可能です。いろんなタグや関数、リダイレクト機能、データベース管理機能が備わってますからね。

    数あるPHPフレームワークの中でも私がおすすめするのは、今熱いと言われているLaravel、EC-CUBEで使われているSymfonyの2つです。

     

    オブジェクト指向について学ぶ

    マスターブックでも少し触れられてはいますが、オブジェクト指向は難しいです。たぶんすぐには理解できないと思います。

    ただ、私は無理してオブジェクト指向をマスターする必要はないと思っています。上記のフレームワークがオブジェクト指向で組まれているので、構造を理解できて編集できる程度の知識があればいいんじゃないでしょうか。自分で1からオブジェクト指向で組むのは現実的とは思えないです。

    たぶん、オブジェクト指向で組む必要があるのは、フレームワークを作るレベルのエキスパートたちですよね。。

     

    まとめ

    わからないことや疑問に思ったことを調べるにはネットが便利ですが、しっかりと基礎を身に着けたければ本を読むほかありません。

    たった一冊の本を読まなかったばっかりに、数年間苦労した私のようにならないためにも。。

     

  • WordPressの記事から括弧”[]”で囲まれた文字列を取り除いて表示する方法

    WordPressの記事から括弧”[]”で囲まれた文字列を取り除いて表示する方法




    FC2とかからWordPressに記事データを移管した際、”[emoji:v-412]”みたいな文字列がたくさんあって邪魔です。

    そんなときは、functions.phpに以下のように記述。

    function content_replace($content) {
    	$content = preg_replace("/\[emoji.+?\]/", "", $content);
    	return $content;
    }
    add_filter('the_content', 'content_replace');

    ちなみに、”[]”で囲まれている文字列全てを削除したい場合は、2行目を

    $content = preg_replace("/\[.+?\]/", "", $content);

    こう変更。

     

    あとは記事を表示させたい場所にいつも通りthe_content();と書けばOK

     

  • WordPress – 特定のタームの記事だけ処理を変えたいときの条件分岐

    WordPress – 特定のタームの記事だけ処理を変えたいときの条件分岐

    「このタームの記事だけ項目を非表示にできますか?」と言われたとき、すぐにはわからなくてちょっと調べたので、以後すぐ思い出せるようにメモ。




    実装

    has_term( ‘slug’, $taxonomy );を使えば簡単。
    第一引数は対象となるターム、第二引数はそのタームが属するタクソノミーを指定します。

    <?php
    if( has_term('service','cat_blog') ) {
      // ここに「service」というタームに属する場合の処理を書く
    } else {
      // それ以外の場合の処理。
    }
    ?>

     

    ただ項目を非表示にするだけでよかったら、

    <?php
    if( !has_term('service','cat_blog') ) { //"service"に属さない場合
      // 処理を行う
    }
    ?>

    これだけでOK。

     

    複数のタームを指定したい場合はarray()を使う。

    <?php
    if( has_term( array('service','shop') ,'cat_blog') ) {
      // ここに「service」もしくは「shop」というタームに属する場合の処理を書く
    } else {
      // それ以外の場合の処理。
    }
    ?>

     

    タクソノミー関係の分岐ってけっこうややこしいので、「どうやってググったらええかすらわからん!!」ってときは、WordPress Codexを見てみるのが一番早いです。

    以下の記事も参考にどうぞ!

    WordPress開発が捗る!ブックマークしておくべきCodexまとめ

     

    以上、現場からでした。

  • WordPress 条件分岐 “is_archive()” が効かないときに確認すること

    WordPress 条件分岐 “is_archive()” が効かないときに確認すること

    is_archive()とは、アーカイブページであるということを示す条件タグです。




    使うときは以下のように使います

    <?php
    if( is_archive() ) {
    	// 投稿一覧ページでのみ行いたい処理
    } else {
    	// その他で行う処理
    }
    ?>

     

    ところが、設定 > 表示設定 で、一覧ページ用の固定ページを指定している(例:infoとか)場合、一覧ページと判別してくれません

    そんなときはis_home()を使いましょう。

    <?php
    if( is_home() || is_archive() ) {
    	// 投稿一覧ページ及びアーカイブページでのみ行いたい処理
    } else {
    	// その他で行う処理
    }
    ?>

    is_home()だけだと全記事一覧ページしか判別してくれない可能性があるので、is_archive()も加えてやることで、カテゴリーページや年別アーカイブページも判別してくれるようになります。

     

    もしかするとトップページでis_home()を使用している方もいるかもしれませんが、
    トップページはis_front_page()で分岐してやるのが正しいです。

  • aタグの中にdiv入れていいんですか!?消えたブロック要素の概念

    aタグの中にdiv入れていいんですか!?消えたブロック要素の概念

    突然ですが、HTML5ではaタグの中にdivやsection等のブロック要素を入れてもいいということを知っているでしょうか。

    HTML5から入った方は、何言ってんだ素人なのかこのおじさんはと思うところでしょう。しかし、HTML4からコーディングをしている世代にとっては革命的なことなのです。おじさんたちはブロック全体をリンクにしたいときにとても困っていました。HTML5が主流になってもう何年も経つのにこの事実を知らなかったし、今でもaタグの中にブロック要素を入れてはいけないという概念をお持ちの方はなかなかに多いんじゃないでしょうか。

    そもそも、HTML5には「ブロック要素」「インライン要素」という分類すらないということを最近知りました。これはまずい。我々でいうところのテーブルレイアウト世代のような時代遅れレッテルを貼られる前に、初心に帰ってHTML5の勉強をしようと思いました。

    詳しいことはHTML5リファレンス等のサイトを参考にしてもらったほうがいいと思いますが、HTML5はこんなことになっていたのかという事実を軽く何点か紹介します。

    HTML5世代も、もしかすると古いサイトの修正とかでHTML4を触ることもあると思うので、HTML4ではできないことがあるということを知っておくためにも、流し読みしていただくといいかもしれないですね。




    コンテンツ・モデル

    前述したとおり、HTML5には、「ブロック要素」「インライン要素」という分類は廃止されており、その代わりにコンテンツ・モデルと呼ばれるモデルでさらに詳細に分類されるようになった。

    セマンティックなコーディングを心掛けるためには、どのタグがどういった役割なのかを抑えておいたほうがいいでしょう。

    参考:http://www.htmq.com/html5/007.shtml

     

    API

    ドラッグ&ドロップやファイルの操作等が、APIの充実により簡単に実装できる。

    ウェブアプリケーションの開発がよりスムーズに行えるようになっているようです。フロントエンドという言葉が流行り出したのも、このAPIが充実してからじゃないでしょうか。

    参考:http://www.htmq.com/api/

     

    画像のRetina対応・レスポンシブ対応

    pictureタグやimgのsrcset属性により、Retinaやレスポンシブにおける画像の切り替えが簡単に行える。これは便利ですよね。僕もよく使ってます。

    ちなみにpictureは画像自体が変わる場合(アートディレクション)に用いるのがお作法のようですね。

    参考:
    https://reference.hyper-text.org/html5/element/picture/
    https://reference.hyper-text.org/html5/attribute/srcset/

     

    他にも便利な変更点が多くありそう。HTML4とCSSで苦労してきた世代は、ぜひ初心に戻ってHTML5とCSS3の仕様をじっくり読んでみるといいでしょう。

    きっとコーディングが楽になると思いますよ。

  • WordPress – その記事が属するカテゴリーの一覧を表示させる関数

    WordPress – その記事が属するカテゴリーの一覧を表示させる関数

    WordPressの記事を書いて、例えばカテゴリーを複数選択したとき(ニュース、日常)、記事の詳細ページとかに、選択したカテゴリーの一覧がいい感じに表示される関数を紹介する。




    functions.phpに以下のように記述

    function show_category( $delimiter = null ) {
      $cats = get_the_category();
      $tmp = $cats;
    
      if( !$cats ) {
        return false;
      }
      
      foreach( $cats as $cat) {
        // 出力部分
        echo $cat->name;
        if( $delimiter && next($tmp) ) {
          echo $delimiter;
        }
      }
    }

     

    使うときは、テンプレートに以下のように書く

    <?php show_category(','); ?>

    出力はこんな感じでされる

    ニュース,日常

    引数には区切り文字(’,’とか’/’)を指定できる。何も指定しない場合は、区切り文字なしで続けて表示される。

     

    カテゴリーをspanとかaタグで囲みたいときは、foreachの中をちょっといじる。

    function show_category( $delimiter = null ) {
      $cats = get_the_category();
      $tmp = $cats;
    
      if( !$cats ) {
        return false;
      }
      
      foreach( $cats as $cat) {
        $cat_id = $cat->term_id;
        $cat_link = get_category_link( $cat_id );
        
        // 出力部分
        echo '<a href="' .$cat_link. '">' .$cat->name. '</a>';
        if( $delimiter && next($tmp) ) {
          echo $delimiter;
        }
      }
    }

    上記のような関数を作り、引数なしで出力すると、そのカテゴリーページへのリンクがついたaタグで囲まれたカテゴリー一覧が出力される。

     

  • WordPress – タイトルの文字数制限を、関数を作っていい感じにやる

    WordPress – タイトルの文字数制限を、関数を作っていい感じにやる

    WordPressのテーマ制作のとき、レイアウトが崩れるのを防ぐためにタイトルの文字数を制限してやる必要がある、という場合。

    タイトルの文字数制限でググればやり方が書いてあるが、毎回書くのはめんどうだしソースもちょっとぐちゃっとなりがちなので、関数を作って、そして簡単に実装できるようにする。




    functions.phpに以下を記述

    function show_limit_title($limit = 20) {
      global $post;
      $title = $post->post_title;
      
      if( mb_strlen( $title ) > $limit) {
        $title= mb_substr( $title , 0 , $limit ) ;
        $show_title = $title. '・・・' ;
      } else {
        $show_title = $title;
      }
    
      echo $show_title;
    }

     

    あとは、タイトルを表示させたい部分に、”the_title();”の代わりに以下のように書くだけ。

    <p><?php show_limit_title(); ?></p>

    デフォルトでは20文字制限となっているので、文字数を変えたい場合は括弧の中に数値を入れてやる。

    // 40文字まで
    <p><?php show_limit_title(40); ?></p>

    場所やカスタム投稿によって表示文字数を変えたい場合は引数の値を変えるだけでいいので、使いやすいです。

    あなたのfunctions.phpのおともに是非!

    functions.phpのちょっとした小技を書いたこちらの記事もどうぞ🤗

    WordPress functions.phpを関数ごとに分割して管理しやすくする話

  • WordPressテーマ作成時に、いろんなサイズのサムネイルのダミー画像をサクッと生成する方法

    WordPressテーマ作成時に、いろんなサイズのサムネイルのダミー画像をサクッと生成する方法

    WordPressのテーマを制作するとき、サムネイル機能をつけることはよくあると思うが、「サムネイル画像が登録されていない場合に表示させるダミー画像」を作るのが意外とめんどくさい。

    今回は、その作業をなるべくぱぱっと終わらせる小技を紹介しよう。




    準備するもの

    何はともあれ、元となる画像を用意しよう。

    上の画像はAdobe Stockのサンプルなので勝手に使わないように。

    大きさは、1920px x 1920pxのものがいいんじゃないだろうか。できるだけいろんな形に切り取られてもおかしくない画像を用意しよう。

    サムネイルサイズの設定

    サムネイルのサイズを複数登録する必要がある際、functions.phpにいつも書くであろうこういうやつ。

    add_image_size( 'arhive-thumbnail', 438, 289, true );
    add_image_size( 'single-topics-thumbnail', 916, 600, true );
    add_image_size( 'single-shop-thumbnail', 458, 300, true );
    add_image_size( 'top-topics-thumbnail', 373, 250, true );
    add_image_size( 'single-shop-thumbnail', 285,200, true );

    …書くよね?

    いつも通りでOK。

    アップロード

    作った画像を管理画面からアップロードしてしまう。

    するとなんということでしょう

    uploadsフォルダ内に、あらゆるサイズで切り取られたダミー画像が勝手にできあがっているじゃありませんか。

    これなら開発の流れでついでにできちゃうし、汎用的な画像をあらかじめ用意しておけば、どのサイトでも使いまわせる。デザイナー様のお手を煩わせるまでもないのである。

  • Vagrant+VCCWでWP開発環境を構築~終了まで

    Vagrant+VCCWでWP開発環境を構築~終了まで

    長年XAMPPを使っていましたが、最近小難しい案件が増えてきたため、そろそろVagrantを使ってみようと思いました。

    取り急ぎWordPressの開発環境がほしいわけで、VCCWを使って開発環境の構築をしてみたところ、いろいろ嵌ったのでメモ。

    なお、Windowsしかわからないので、Macでの場合とはちょいちょい違うこともあると思います。

    準備からの流れは以下の通り

    1. VirtualBoxのインストール(初回のみ)
    2. Vagrantのインストール(初回のみ)
    3. VCCWのダウンロード
    4. vagrant-hostsupdaterのインストール(初回のみ)
    5. 初期設定
    6. Vagrant起動
    7. Vagrant終了(だいじ)

    順に見ていきましょう。




    Virtualboxのインストール(初回のみ)

    公式サイトから最新版をインストール。僕の場合はOracle VM VirtualBox Base Packages – 5.2.8 (Microsoft Windows Only)をダウンロードし、インストールしました。

    いやいやVirtualBoxってなんやねん

    Vagrantの前に、実はこのVirtualBoxというやつが大事です。

    そもそもVagrantというのは、簡単にいうとサーバーの環境情報を書き込まれたファイルであって、これだけではサーバーとしての機能はありません。

    VirtualBoxという仮想マシンを使ってVagrantという設定ファイルを読み込み、仮想サーバーを立ち上げるということになります。

    言ってしまえば、VirtualBoxこそがサーバーの本体です。

     

    Vagrantのインストール(初回のみ)

    公式サイトからWindowの64bit版をダウンロードし、インストール。

     

    上記2つは、インストール中も特にオプションとか変更はせず、ストレートにそのままインストールしました。
    2つともインストールしたら、PCは再起動したほうがいいらしいので、再起動しました。

     

    VCCWのダウンロード

    PCの再起動が終わったら、おもむろにコマンドプロンプトを開き、開発環境を構築すると思われるディレクトリに移動。

    僕の場合は、”C:\vagrant”というディレクトリを作り、その中で開発環境を構築することに。

    cd ../../
    mkdir vagrant

    C直下まで移動し、vagrantというディレクトリを作る。これくらいであればマウスの右クリックでもできるので、どっちでもいいんですが、黒い画面でできるようになっていたほうが後々便利ですよ。

    次に、vagrantのディレクトリに入り、更にsampleというディレクトリを作り、そしてその中に入る。

    cd vagrant
    mkdir sample
    cd sample

    次は、vccwをgitからダウンロードさせていただく。

    git clone https://github.com/miya0001/vccw.git

    うまくいけば、vccwというディレクトリが作成され、その中にいろいろ入っているのが確認できると思います。

    今のうちにvccwディレクトリ内に移動しておきましょう。

    cd vccw

    vagrant-hostsupdaterのインストール(初回のみ)

    vagrant-hostsupdaterは、hostsファイルを自動で書き換えてくれるプラグイン。これがあれば、vagrant up したあとにhostnameで設定したURLでブラウザからアクセスできるようになる。ちなみにこれはVagrant本体と同じく、PC1台につき1回インストールすればOK。

    vagrant plugin install vagrant-hostsupdater



    初期設定

    vagrant upする前に、WordPressインストール時の設定をいじっておきましょう。

    site.ymlの編集

    provisionディレクトリ内にあるdefault.ymlを、vccwディレクトリ直下に移動し名前をsite.ymlに変更する。コマンドプロンプトなら以下でできる

    copy provision/default.yml site.yml

    site.ymlをエディタで開き、設定をちょっといじる。WordPressの初期設定をいろいろいじれるようになっているが、とりあえず重要なのは以下

    • hostname
    • ip
    • lang

    hostnameは、そこに設定したアドレスでブラウザから確認できるようになる。ここで注意したい点が以下の2つ

    • 実際にあるドメインは使用しないほうがいい。
    • ~.devという形式は、chromeでは使用できないらしい。sample.testとかにすればOK

    ipは、最初は初期設定のままでOKなんですが、環境を複数構築したい場合は、ipが同じだとうまくいかないっぽいので、値を変える必要がありそう。(例:192.168.33.11)

    langは言語設定。日本語が良ければ”en_us”→”ja”にしておきましょう。



    他にもデバッグモードとかマルチブログモードの設定もできるようになっています。好みに合わせて設定しましょう。

    Vagrant 起動

    vagrant up

    実際にブラウザでsample.testとうってアクセスし、うまく表示されていれば大成功!

    念のため管理画面にログインしてみます。

    ログインの初期設定は、デフォルトでは(admin/admin)になっているみたいです。本番にアップする際に面倒なので、最初からsite.ymlを編集してちゃんとしたアイパスに設定しておいたほきましょう。

     

    Vagrant終了(だいじ)

    Vagrantを起動したら、基本的にずっと起動したままになっています。

    これだとPCをシャットダウンできない事態に陥るため、作業終了の際は必ずVagrantを終了させてやりましょう。

    vagrant halt

    Vagrantの起動状態を確認

    終了させたら、Vagrantが終了したかを確認しときましょう。

    vagrant status

    Current machine states:

    wptest.test poweroff (virtualbox)

    The VM is powered off. To restart the VM, simply run `vagrant up`

    poweroffって出てるので止まったみたい。

     

    はまった点

    vagrant-hostsupdaterをインストールしていなかったため、アクセスできずにややはまり。そしてvccwを1回削除し、同じ名前のディレクトリ、同じIPでもう1回インストールしたら、hostnameは変わったもののWordPressのインストールディレクトリが以前のままになっていて(データベースに記録されているんだろうか…よくわからない)レイアウトが大爆発してはまった。

    • vagrant-hostsupdaterを忘れない(初回のみ)
    • IP、hostnameはプロジェクトごとに変える

    これを気を付ければスマートにいけると思います。

  • WordPress 国産で無料のブログ用テーマ「Simplicity」の紹介

    WordPress 国産で無料のブログ用テーマ「Simplicity」の紹介

    突然だが、テーマが変わったのにお気づきだろうか。

    当ブログの読者はほとんどいないため、おそらく気付いているとかいう以前の問題だとは思うが、テーマを変更したのには理由がある。

    私は、当ブログを「テーマのカスタマイズをまったく行わない」という縛りプレイのもと運営している。具体的には、テンプレートを直接いじらない(functions.phpも含め)ということだ。

    フロントエンドエンジニアなのに何しとんねんと思われるかもしれないが、一種の遊びのようなものである。気にしないでほしい。テーマを自作する程度のスキルはちゃんとある。

    そして、今までは「Kale」という海外製のシンプルなテーマを使用していたのだが、カスタマイズをしないのにシンプルなテーマを選ぶという愚かさにとうとう気付いてしまい、しかもフォントも日本向けではないので読みづらいという理由もあったため、カスタマイズに優れていて、日本製で、無料であるという条件のもと、新しいテーマを探した。

    そんなとき出会ったのが、この「Simplicity」である。

    「Simplicity」のダウンロードはこちら




    Simplictyのすごいところ

    インストールして30分くらいしか経っていないが、それだけの時間でもこのテーマのすばらしさを実感できたため、軽く紹介させていただく。

    カスタマイザーが豊富

    明らかに無料ではないレベルのカスタマイズの数々。

    レイアウトの設定も数多く、SEOやアクセス解析の設定、SNSの設定などもできる。

    特にすごいのがこのスキン機能

    ワンクリックでサイトの雰囲気をガラリと変えることができる。しかも種類が多い。

     

    記事ページがすごい

    非常に読みやすい。

    見出しのスタイルもオシャレだし、可読性が良い。日本人には日本人の読みやすさがあるんだと痛感した。

    前のテーマのときもなんとか頑張って読みやすいようにスタイルを調整していたのだが、Simplicityは最初から圧倒的に読みやすいのだ。

     

    記事の下には、よくあるシェアボタンや関連記事が最初からついてる。プラグインとかいらない。

     

    ウィジェットがすごい

    途方もない数のウィジェットが設定できる。広告用のウィジェットまである。

     

    とりあえずざっと見た感じでもこんなにすごい。おそらくもっといろいろな機能があるのだろう。無料というのが信じられない。あとで請求とかされないよね?(されない)

    とにかく今すぐWordPressでブログ書きたいんじゃ!という人には本当にオススメ。

  • WordPress 特定のページを404にリダイレクトさせる方法

    WordPress 特定のページを404にリダイレクトさせる方法

    例えば、WordPressの仕様上絶対に生成されてしまうんだけど、アクセスされたくないので404にしたい場合。
    あんまないとは思うんですけどね…




    functions.phpに以下のように記述

    add_action( 'template_redirect', 'status404' );
    
    function status404() {
      if ( is_tax(array('hoge','moge')) ) {
        global $wp_query;
        $wp_query->set_404();
        status_header(404);
      }
    }

    上記の場合は、”hoge”もしくは”moge”というスラッグのついたタクソノミーページを404にするというものです。

    条件分岐タグを使えば、404にするページを複数指定できます。
    条件分岐タグ一覧

    この分岐の条件を間違えると、全然違うページが404になったりして大変なことになるので、実装する場合はよくチェックしましょう。