投稿者: ぜろみや

  • もっと時間を自由に使えるフリーランスになるために心がけること

    もっと時間を自由に使えるフリーランスになるために心がけること

    フリーランスになったはいいけど、会社員より忙しいし、進捗が全然上がらない…しかもめちゃくちゃ忙しいのにたいして稼げない。

    フリーランスになって仕事がコンスタントに入ってくるようになると、こういった悩みにぶち当たります。

    原因は、「時間の使い方が下手」なことにあります。

    少しでも時間を上手に使えるにはどうしたらいいか、考えていきましょう。




    働きすぎ

    まず第一に、働きすぎ、すなわち、一日のうち受託制作に使っている時間が長すぎないかを見直してみましょう。

    会社員の頃は、だいたい8時間は働きますね。制作となると、残業ありきで10時間、12時間くらい働いていることもあると思います。

    じゃあフリーランスも同じくらい働こうぞとなるわけですが、ちょっと待ってください。我々フリーランスは、受託制作作業以外にもやることがいっぱいあるんです。

    例えば経理、経営、マーケティングであったり、連絡、見積もり制作、マネジメント、そして受託だけだとジリ貧になるので、他のストック型事業をがんばるフリーランスもいるでしょう。

    こんなにやることがあるのに、1日8時間をまるまる受託に使っていたら死んでしまいます。週に4日しか働いてないとか、そんなに毎日働いてないならいいんですが、いつでも案件がある状態になるとなかなかそうもいきません。

    1日のうち受託制作作業に使う時間は、平均5時間くらいでちょうどいいと思うんです。

    「5時間超えたら残業」という心構えでいるとだいぶ楽になります。

    https://meshikui.com/2018/09/16/965/

    単価安すぎ

    見積りが安すぎる。これはマジでやばいです。

    見積りは金額だけでなく、その金額をもとにスケジュールが決まったり、逆にスケジュールから見積もりを考えたりと、「使う時間」にも大きく影響があります。

    見積りが安いと、スケジュールがタイトになりがちで、しかもお金が足りないのでたくさん働かないといけません。

    見積りがちょうどいいと、スケジュールにもお金にも余裕ができ、他のことにかけられる時間が増えます。

    ただ単価をちょうどよくする。
    それだけで、救える命があります。

    え?「今まで激安単価で請けてたクライアントが、単価を上げると仕事をくれなくなる」?

    ちょうどいいじゃないですか!

    そんな激安じゃないと仕事くれないクライアントとはとっととおさらばして、いいクライアント探しましょう。

    今の単価じゃないとどこも請けてくれない…と思うようであれば、自分に自信がないということです。最初のうちは安くてもいいと思いますが、それはつまり「自分は安物」と言ってるようなものなので、ちゃんと適性価格で買ってもらえる程度には技術を磨いておきましょう。

    ちなみに僕は、フリーランス初期に比べ単価が1.8倍くらいになってますが、時間に余裕ができ、収入が増え、残念なクライアントとはお別れできて今のところいいことしかありません。

    もらうのは実作業費だけじゃない

    20時間コーディングしたら納品だから、5,000円×20日=10万円…というわけではないです。

    我々フリーランスは、ただコーディングやデザインをするだけでなく、間違いなくディレクションもやってますし、連絡や調査、相談などといったことにいちいち時間をとられます。

    受託は時間を売っていますので、時間のかかることは全て工数なのです。

    ただしそんな時間はどれくらいあるのかなんて事前にはわかりませんので、そんなときは「バッファをとる」という便利な言葉を使います。

    だいたいは、「実作業にかかると思われる時間」を1.5倍することでちょうどいいとされています。例えば2時間かかる作業なら、5,000円×2×1.5で、1.5万円。
    そして、もちろん時間も3時間かかることにして見積もります。

    マジか詐欺じゃんと思うかもしれませんが、全然詐欺じゃなく、普通のことです。みんなやってます。
    そして、だいたいバッファがあってもあんまり余裕がない場合が多いです。

    ちなみに、わざわざクライアントに提出するときに「バッファ」とは言わないようにしましょう。見えないようにただ数字を増やしておくだけでオッケーです。

    フリーランスは相場を気にするだけで生きるのが楽になるという話

    連絡しすぎ

    複数の案件を抱えていたり、クライアントが増えてくると、チャットがめっちゃ来ます。

    作業をしているときにいちいち全部対応していると、作業が中断され一向に進まないです。

    「オッケーです」くらいの返事であればすぐ返せばいいと思うんですが、ちょっと調査が必要だったり、長文を打つ必要がある場合、けっこう時間を喰います。

    そのかかった時間分を意識していないと、かなり長い時間働くことになります。

    「クライアントからの連絡がこない、土日や夜が捗る」なんてのは正直つらいし笑い事じゃないので、できれば営業時間内にうまいこと捌いて、かつ作業もいい感じで5時間で終わらせたい。

    そう。フリーランスも、定時で帰りたい。

    そんなときは、次のように心がけるといいでしょう。

    来たチャットは、すぐ見てもいい。
    ただし、すぐ返す必要がなさそうであれば、あとまわしにする。

    もしかすると緊急の内容かもしれないし、一言返事をすれば終わる連絡かもしれないので、来たらすぐ見ていいです。

    なかには、連絡すると決めた時間以外は一切見ないという人もいますが、なかなかそうはいかないと思うんです。

    そこで、ひとまず見るだけ見て、特に今返す必要がなさそうであれば、あとでまとめて返信することにすれば、緊急にも対応できますし、作業の効率もそれほど落ちることはありません。

    連絡を返すタイミングは、例えば以下のときがいいでしょう

    • 朝9時くらい。クライアントがちょうど就業するくらいの時間
    • 昼11時半くらい。昼休憩の前、ちょっとしたクールダウンも込めて。
    • 昼休憩後。
    • 夕方16:00くらい
    • 終業前

    こんな感じで、2時間置きくらいを目安に返していれば、特にレスポンスが悪いと思われることもないと思います。

    緊急の要件の場合はすぐ対応したり、時間かかりそうであれば「調査にお時間いただき、後ほど回答させていただきます」のようにとりあえず答えておくのもいいです。

    https://meshikui.com/2018/10/23/1172/

    おわり

    フリーランス働きすぎ問題には、「安すぎ」がまず根本的な問題である場合が多いです。ここを解決しないと、タイムマネジメントとか言ってる場合じゃないので、まずは適正価格で仕事を請けられるよう努力しましょう。

    それから、時間をうまく使えるようタイムマネジメントを行っていきましょう。
    時間に余裕ができれば、事業拡大のチャンスです。

    時間を制すものは、事業を制します。たぶん。

     

    ではでは、ゴールデンなタイムマネジメントを!

  • 【Sass】BEMとSMACSSをなんとなく使っていい感じのCSS設計

    【Sass】BEMとSMACSSをなんとなく使っていい感じのCSS設計

    CSS設計、やってますか?
    何も考えずに命名したりCSSを書いていると、拡張性や管理性を損なうとんでもないものが出来上がります。
    作ったときはいいけど、後で修正したり追加したりするときに、どこか知らんとこがついでに崩れたり、反映されないからどんどん!importantで上書きしてガチガチに絡まったCSSになったりします。

    そういった問題を防ぐためにも、CSS設計をちょっとでもいいので心がけるようにしていきましょう。
    最初はちょっとしんどいかもしれませんが、慣れてくると「どんな名前をつければいいか」に悩む時間も減りますので、効率爆上がりです。

    僕は、BEMとSMACSSという2つの設計方法をなんとなく取り入れ、CSS設計を行っています。
    両方とも完璧に取り入れようとすると逆にしんどいので、なんとなくでいいんです。
    とりあえず意識してみることから始めて、もっとこうしたほうがいいかなーと思ったら改善していくといった流れでいくのがオススメ。

    CSS設計ができるようになると、

    • コーディングが早くなる。
    • わかりやすいコードを書ける。
    • メンテナンス性がいいので、修正や追加のときも楽ちん。
    • 一歩上に行ける気がする

    いいことづくしです。
    まずはBEMとSMACSSがどんなものなのかをだいたい説明して、組み合わせることのメリットを紹介したいと思います。

    ちなみに、僕のフレームワークをGithubで公開していますので、SMACSSについては合わせて読むとわかりやすいと思います。
    それでは、参りましょう。





    BEMとは?

    下の記事でもさらっと紹介していますが、

    初心者がコーディングを3倍速くするために知っておきたい6つの技術

    BlockElementModifireという3つの概念の頭文字をとったものです。
    難しいことは考えず、基本的にこの3つを使ってclass名をつけるということだけ頭に入れておきましょう。

    Block

    ヘッダー、フッターや記事一覧の繰り返し要素など、大まかなパーツ。
    Blockの中にBlockを含んでもいいが、cssではBlockを入れ子にしない

    Element

    Blockに所属する、細かいパーツ。
    その所属するBlock内でのみcssが機能する

    Modifire

    Block、およびElementにて、既存のものとほとんど一緒だけど、ちょっとだけ違う部分があるというときに使う
    バリエーションを与える役割がある。

    命名方法

    命名方法は人によってけっこう違うみたいだけど、Block、Element、Modifireの関係性がわかればOK。

    例えば僕は以下のように命名します

    {Block}__{Element}
    {Block}-{Modifire}
    {Block}__{Element}-{Modifire}

    BEMを使って命名する場合、最初は必ずBlockからはじまり、ElementとModifireの前にそれぞれ別のつなぎをくっつけます。
    アンダースコアとか、アイフンとか、なんでもいいです。
    ただ、Elementの前はアンダースコア2つというのはけっこう共通認識みたいなので、これはこれでいったほうが他の人が見たときに、「あ、BEMだな」とわかりやすいかと思います。

    図で説明するとこんな感じ

    <div class="archiveItem">
      <a class="archiveItem__inner">
        <div class="archiveItem__thumb"><img src="" alt=""></div>
        <div class="archiveItem__right">
          <h2 class="ardhiveItem__title">タイトルタイトル</h2>
          <p class="archiveItem__text">テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
        </div>
      </a>
    </div>
    <div class="archiveItem">
      <a class="archiveItem__inner">
        <div class="archiveItem__thumb"><img src="" alt=""></div>
        <div class="archiveItem__right">
          <h2 class="ardhiveItem__title">タイトルタイトル</h2>
          <p class="archiveItem__text">テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
        </div>
      </a>
    </div>
    <div class="archiveItem">
      <a class="archiveItem__inner">
        <div class="archiveItem__thumb"><img src="" alt=""></div>
        <div class="archiveItem__right">
          <h2 class="ardhiveItem__title">タイトルタイトル</h2>
          <p class="archiveItem__text">テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
        </div>
      </a>
    </div>

    ちなみBlockは、キャメルになってもいいです。

    こんな感じで各パーツ全てにclass名をつけます。
    そして驚くべきことに、これら全てのパーツはcssで入れ子にならないということに気づくかと思います。
    入れ子にならないというのはかなり安全で、読みやすく、そして指定しやすいです。

    さらに、命名にかかる時間も大幅に短縮されます。Block名さえ考えれば、Elementはtextとかthumbとか適当でいいですからね。
    これが、入れ子だとどうでしょうか。
    下のように、全然スタイルが違う.archiveListと.rankingListがあるとして、

    <div class="archiveList">
      <h2 class="title"></h2>
      <p class="text"></p>
    </div>
    
    <div class="rankingList">
      <h2 class="title"></h2>
      <p class="text"></p>
    </div>

    中に.titleと.textがある。cssは、こんな感じですよね

    .archive .text {
    
    }
    .ranking .text {
      
    }

    じゃあ、もし次のような構造だったら?

    <div class="archiveList">
      <h2 class="title"></h2>
      <p class="text"></p>
    
      <div class="rankingList">
        <h2 class="title"></h2>
        <p class="text"></p>
      </div>
      
    </div>

    一気にややこしくなりましたね。
    こうなってくると、うーんどう名前つけようか…となってくるわけですが、BEMだと一瞬です。

     

    「いやこんなんcss書くのめんどいやん!」と思うかもしれません。
    しかし安心してください。
    ここでSassの出番です。

    cssでは以下のように書くところを、

    .archiveItem {
      margin-bottom: 20px;
    }
    .archiveItem__inner {
      display: flex;
      padding: 10px;
    }
    .archiveItem__thumb {
      margin-right: 20px;
    }

    Sass(scss)では以下のように書けます。

    .archiveItem {
      margin-bottom: 20px;
      &__inner {
        display: flex;
        padding: 10px;
      }
      &__thumb {
        margin-right: 20px;
      }
    }

    猛烈にわかりやすいですよね。

     

    実際は入れ子構造になってないのに、Sassなら入れ子で書けるし、親子関係が一発でわかる。これがBEMのメリットです。

    いやModifireは?

    忘れかけてましたが、Modifireの使い方もやっておきましょう。

    Modifireは、ほとんど同じだけど、ちょっとだけ違う、言うなれば「別パターン」を作りたいときに使用します。

    例えば以下のように。

    左右の順番が違うだけで、あとは全部一緒。ってときにほんの少しスタイル書き足すだけなのに(ちなみに順番を逆にするのは ”flex-direction: row-reverce;” でいけます)、それぞれ別々のBlockとして命名するのはめちゃくちゃめんどくさいですよね。

    そこで登場するのが、Modifireです。こんな感じで命名します

    <div class="archiveItem">
      <a class="archiveItem__inner">
        <div class="archiveItem__thumb"><img src="" alt=""></div>
        <div class="archiveItem__right">
          <h2 class="ardhiveItem__title">タイトルタイトル</h2>
          <p class="archiveItem__text">テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
        </div>
      </a>
    </div>
    <div class="archiveItem archiveItem-reverce">
      <a class="archiveItem__inner">
        <div class="archiveItem__thumb"><img src="" alt=""></div>
        <div class="archiveItem__right">
          <h2 class="ardhiveItem__title">タイトルタイトル</h2>
          <p class="archiveItem__text">テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
        </div>
      </a>
    </div>

    もともとのBlockのClass名はそのまま残したうえで、”-{Modifire}”をくっつけたClassを更に追加します。これにより、ほとんどhtmlを書き換えることなく、さらにぱっと見ただけでも「あ、基本同じだけど別パターンあるな」ということがわかりやすいです。

    これでModifireも大丈夫ですね。

    じゃあ次は、SMACSSの話をしましょう。

     

    SMACSSとは?

    SMACSS(スマックスと読むらしいです)とは、BEMとはまた違ったCSS設計の一つです。

    本当はけっこう奥が深いんですが、今回のテーマは「BEMとSMACSSをなんとなく組み合わせたいい感じのCSS設計」なので、ひとまず全体をふわっと説明したあと、必要な部分だけ掘り下げていきましょう。

    CSSのカテゴライズ

    SMACSSの基本の考え方は、CSSを5つのカテゴリーに分類することです。

    • ベース
    • レイアウト
    • モジュール
    • 状態(ステート)
    • テーマ

    ちなみに、僕はテーマは使ってません

    ベース

    要素そのものにつけるスタイル。

    p, div, input等、classに関係なく基本的なスタイリングを行う。リセットCSSもここに属すると考えていい。

    ここでは、IDやclassによる指定は行わないが、属性([type=”text”])や疑似クラス(:hover)は使ってもいい。

    レイアウト

    迷ったら全部ここ。

    モジュール

    再利用可能なもの。
    ボタンとか、汎用クラス(.mb20みたいなやつ)もここに属する。
    「いろんな場所、ページで共通して使われるパーツ」を書くといい。

    “modBtn”,”modTitle”のように、”mod”をつけることが多い。

    モジュールでは、BEMによる命名規則を行わない

    状態(ステート)

    あるclassに対し、状態が変わる際に付与されるclass。
    たとえば、「メニューが開いたとき」なんかに使う。”is-open”,”is-active”のような命名のしかたをする。

    この命名をすることで、JavaScriptの指定がすごくやりやすい

    例えば.menuに対し、開いたときの状態をスタイリングしたい場合、

    <div class="menu is-open">メニュー</div>

    のように書く。

    テーマ

    色や背景等、サイトの全体で統一されるスタイルを書く。

    BEMのModifierがあるし、Sassだと変数が使えるので正直いらないと思う

     

    厳密にはけっこう違う(特にレイアウトとか)けど、僕がやってるやり方の場合、これでいいんです。なんとなくで。次いきましょう。

     

    SMACSSの真骨頂はSassで発揮される

    今まで紹介した、cssのカテゴリ分けですが、これだけだと「で?分けてどうすんの?」って感じですが、これはSassを使うことで便利になります。

    Sassには、cssにコンパイルするときに複数のsass(scss)ファイルをまとめるという機能があります。
    これを応用し、以下のようにファイルを分けます。

    “_base”,”_layout”,”_modlue”,”_state”には、それぞれカテゴリ分けされたcssを書きます。
    style.scssは、これらをまとめる記述だけです。

    @charset "UTF-8";
    
    // Include Base Style
    @import "base";
    
    // Styling Start
    @import "layout";
    @import "module";
    @import "state";

     

    ファイルの前にアンダースコアがあるものは、コンパイルの際にcssファイルとして生成されないという特徴を利用しています。
    逆にこれをつけないと、最終的にほしいのはstyle.cssだけなのに、他のいらないファイルも全部生成されて邪魔になっちゃいます。

     

    僕の場合は、更にアレンジを加えて、baseからリセット(もしくはノーマライズ)CSSだけを切り離した”normalize”ディレクトリ、ページごとにスタイリングするための”page”ディレクトリ、mixinや基本設定を記述する”lib”、外部ライブラリのスタイルを上書きするための”vend”といったファイルを作っています。
    今回は触れませんが、興味があれば記事の冒頭で紹介したGithubを眺めてみてくださいね。

    いちおうthemeも入れてるんですが、ほぼ使うことはありません。

     

    SMACSSは、カテゴリ分けすることにより可読性、メンテナンス性、拡張性の向上といったメリットがあります。逆にこれをSassを使わずcssだけでやろうとすると面倒なので、使うときはSassとセットだと認識していたほうがいいと思います。



    なんでBEMとSMACSSを組み合わせたの?

    組み合わせるといっても、ただ単に

    • BEMで命名して
    • SMACSSっぽくカテゴライズする

    だけなんですが、SMACSSはその概念の一部のみを利用しています。

    その理由は、SMACSSのデメリットを解消するためです。

    SMACSSは非常に便利なんですが、とにかく難しくて考えることが多く、下手をすれば逆に時間がかかります。
    いくら後々メンテナンス性がよくなるといっても、作るときに疲れるのはいやです。

    特に、レイアウトとモジュールの使い分けの部分ですね。
    この2つ、実際はもっとややこしいんです。
    たぶん、この記事に書いてあるレイアウトとモジュールの概念は、実際にSMACSSでググると出てくるものと全然違うだいぶゆるいものになっていると思います。

    なんでこんなにゆるくなったかというと、このめんどい部分をBEMの命名規則に肩代わりさせてるからなんですね。
    BEMを使うことで、どうしたらいいんだと迷う時間が減ります。

    SMACSSの”レイアウト”は、BEMでいうところの”Block”なんですが、何せBEMで命名していますので、全てlayout.scss内に書いても辻褄があいます。

    SMACSSのthemeを使わないのも、BEMの”Modifier”があるからです。
    そして、これも全部”layout”に書いてしまうことにしてしまえば(もしくは、ページごとに分ければ)、シンプルですっきりしますし、SMACSSのメリットを失いません。

     

    逆に、BEMの命名が成り立たないもの、単独で使う汎用クラスは”モジュール”にカテゴライズするとすれば、わかりやすいと思います。

    BEMが使えるものはレイアウト、BEMを使わないものはモジュール

    おわり

    SMACSSについては少し我流な部分がありますが、BEMもSMACSSも別にそうしなきゃいけないというルールがあるわけではなく、あくまでガイドラインなので、お互いのいい部分を組み合わせ、楽に、そしていい感じのCSS設計ができるようにしましょう。

    時間をかけずに、しかも苦しまずに、いいものを作れたら最高ですよね。

     

    それでは、ビクトリーなCSS設計を!

    バイバイ~

  • flexで3列以上横並びにするとき、左右をコンテンツ端に合わせるやり方

    flexで3列以上横並びにするとき、左右をコンテンツ端に合わせるやり方

    cssのflexを使って、3列以上の幅が均等な要素を横並びにして左右にぴったりくっつけたい場合、以下のように記述すればOK。




    <div class="box">
    	<div class="item"></div>
    	<div class="item"></div>
    	<div class="item"></div>
    </div>
    .box {
    	display: flex;
    	justify-content: space-between;
    }

     

    2行以上にする場合はflex-wrap:wrap;を追加。

    .box {
    	display: flex;
    	justify-content: space-between;
    	flex-wrap: wrap;
    }

    しかしこのままだと、要素の数が決まっていない場合で、例えば5個とかの場合に問題が発生する。こんな感じになっちゃう

    3列ならまだ「こういうもんなの…ちょっとおかしい気もするけど…まぁいいか」で済ませられることもあるけど、4列・5列となるにつれどんどん気持ち悪くなっていく。

    これをシンプルに解決する方法がこちら。

    解決方法

    結論からいうと、こういう場合はjustify-content: space-between;は使いません

    なんか疑似要素やjQueryを使って空の要素を補完するとかいう方法を見かけましたが、そんな無理してやらなくても、同じようなことはできます。

    パターンA:親要素を左にちょっとずらす

    以下のように、子要素は均等にmargin-leftをつけておき、親要素自体を左にちょっとずらす

    .box {
    	display: flex;
    	flex-wrap: wrap;
    	margin-left: -20px;
    }
    .item {
    	margin-left: 20px;
    }

    書き方はスッキリしていて、いいと思います。

    ただ、幅を%で指定したいときや、親要素を左にずらすスペースがない場合ややこしいので、僕は次のパターンBを推します。

    パターンB:一番左の子要素だけmargin-left:0;にする

    疑似要素 :nth-child() を利用して、一番左の子要素だけmargin-left:0;にしちゃいましょう。

    また、レスポンシブの場合は画面幅によって並べる数が違うと思うので、メディアクエリを使うとスッキリします。

    .box {
    	display: flex;
    	flex-wrap: wrap;
    }
    .item {
    	margin-left: 20px;
    }
    @media screen and (min-width: 751px){
    	.item:nth-child(3n+1) {
    		margin-left: 0;
    	}
    }

     

    さらにいうと、スマホでは2列!という場合、justify-content:spcae-between;のほうが幅を気にせずに済むので、効率がいいです。

     

    例:1000px以上は4列、751px~1000pxでは3列、750px以下(スマホ)では2列にするよ!

    .box {
    	display: flex;
    	flex-wrap: wrap;
    }
    .item {
    	margin-left: 20px;
    }
    @media screen and (min-width: 1001px){
    	.item:nth-child(4n+1) {
    		margin-left: 0;
    	}
    }
    @media screen and (min-width: 751px){
    	.item:nth-child(3n+1) {
    		margin-left: 0;
    	}
    }
    @media screen and (max-width: 750px){
    	.box {
    		justify-content: space-between;
    	}
    	.item {
    		margin-left: 0;
    	}
    }

     

    以上、現場からでした。

  • .htaccessで常時SSL化~wwwのありなし統一も添えて

    .htaccessで常時SSL化~wwwのありなし統一も添えて

    .htaccessで常時SSL化・正規化するとき、いつも調べまわるのでいい加減メモ。

    なお、常時SSL化だけやって正規化はやらないというパターンのメリットはないので、どうせなら両方やっちゃいましょう。




    常時SSL化+wwwなし

    一番あるやつ。

    RewriteEngine on
    RewriteBase /
    RewriteCond %{HTTP_HOST} ^(www\.hoge\.com)(:80)? [NC]
    RewriteRule ^(.*) https://hoge.com/$1 [R=301,L]
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

    常時SSL化+wwwあり

    最近あんまりwwwありに統一するパターンは少なくなってきましたね。

    RewriteEngine on
    RewriteBase /
    RewriteCond %{HTTP_HOST} ^(hoge\.com)(:80)? [NC]
    RewriteRule ^(.*) https://www.hoge.com/$1 [R=301,L]
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://www.hoge\.com/%{REQUEST_URI} [R,L]

     

    サーバーによっては記述が違うこともあるかもしれないけど、だいたいはいけるはず…

     

    ちなみにWordPressの場合は、「設定→一般」から「WordPressアドレス」と「サイトアドレス」を両方httpsにして、そのあとパーマリンク設定を更新するだけでOK。正規化は最初からされています。

     

    以上、現場からでした。

  • XAMPPでドキュメントルートを変更し、ルートパスを使えるようにする

    XAMPPでドキュメントルートを変更し、ルートパスを使えるようにする

    Windows使いのみなさん、XAMPP使ってますか?僕はバリバリ使ってます。

    XAMPPはダメだ!という声をよく聞きますが、Webサイト制作という点においては、気軽に使えてめっちゃ便利です。複雑なシステムを組むために、サーバーのチューニングを独自にやらなきゃいけない場合なんかはちょっと厳しいのでVagrantとか使ったほうがいいと思いますが、レンタルサーバー使う程度であればやはりXAMPP最強といっても過言ではないかもしれません。ちょっとPHPの入れ替えがめんどくさいかもですね。

    さてそんなXAMPPですが、ドキュメントルートが”http://localhost/”となっているため、ルートパスを使いたいときなんかに不便ですよね。

    “xampp/htdocs/hoge/”というディレクトリで作業しているとすれば、ドキュメントルートを”http://hoge/”にしたい。あると思います。やってみましょう。




    設定

    触るファイルは、以下2つだけです。

    • C: /xampp/apache/httpd.conf
    • C: /windows/System32/drivers/etc/hosts

    両方とも場所を覚えるのがめんどいので、ディレクトリをショートカットに登録しておくといいでしょう。

    httpd.conf

    これはxamppのApacheの編集ファイルです。このファイルを編集する前に、XAMPPのコンパネでApacheを起動している場合は、停止してください。別に停止してないとぶっ壊れるとかじゃないんですが、ファイルを編集したあとはApacheを再起動しなければいけないので、最初から止めといたほうが忘れずに済みます。

    例えば”xampp/htdocs/hoge”をルートにしたい場合、ファイルの一番下に、以下のように記述します。

    <VirtualHost *:80>
    DocumentRoot "C:/xampp/htdocs/hoge"
    ServerName hoge
    </VirtualHost>

    ちなみに、もっと深い階層でもいけます。

    <VirtualHost *:80>
    DocumentRoot "C:/xampp/htdocs/hoge/www/htdocs"
    ServerName hoge
    </VirtualHost>

    hosts

    こちらは、Windowsのシステムです。権限がないと編集できないことがありますので、管理者権限のあるアカウントで作業してください。

    一番下に、以下のように書きます。

    127.0.0.1 hoge

    hostsファイルにこのように書くと、ブラウザを開いてURLに”hoge”とうつだけで、”127.0.0.1″、つまりlocalhostのIPに接続できるようになります。

    これは、Webに公開されているIPにも適用されます。つまり、サーバーは公開されてるけどDNSがまだ向いていないという環境で作業するときに役に立ちます。WordPressのサーバー引越しとかに使います。

     

    Apache再起動

    hostsとhttpd.confの設定が終わったら、XAMPPのコンパネを開きApacheを再起動しましょう。そしてブラウザのURL入力欄で”hoge”とうつと、”http://hoge”というURLで、”xampp/htdocs/hoge”がちゃんとルートディレクトリになっていることが確認できるかと思います。

     

    作業が終わったら、httpd.confに書いた記述と、念のためhostsに書いた記述もコメントアウトしておきましょう。

    以上、現場からでした。

  • WordPress 固定ページ内でページネーションを使ったら404になる原因と対策

    WordPress 固定ページ内でページネーションを使ったら404になる原因と対策

    あんまりやりたくないパターンだけど、WordPressの固定ページテンプレート内で記事一覧を表示させ、あまつさえページネーションもつけたいというときがある。

    このページネーションの2ページ目以降が404になってはまったけど、動かない原因と対策がわかったのでメモ。




    なぜ404となるのか

    固定ページ内でページネーションを使うと404になる原因についてですが、たぶん以下のような感じだと思います。

    • ページネーションの仕様上、2ページ目とかのURLに、/page/2/とかがつく
    • 例えば/hoge/page/2/のようなパーマリンクになる
    • そんな固定ページはないので、404になる。

    まぁ、固定ページでそもそもページネーションできるようになっていないんでしょうね。そりゃそうよ。

    解決策

    /page/2/みたいにならなければいいんじゃないか。

    WordPressでは、上記のようなURL構造でなくとも、?page=2みたいなパラメータでもページネーションになります。

    ただし、デフォルトだと?page=2にアクセスしても、/page/2/にリダイレクトされてしまう。

    よって、ページネーションのURLの形式を?page=2にして、なおかつ勝手にリダイレクトさせないようにすればOK

    実装

    functions.phpに以下を記述

    add_filter('redirect_canonical','my_disable_redirect_canonical');
    function my_disable_redirect_canonical( $redirect_url ) {
    
        if ( is_archive() ){
            $subject = $redirect_url;
            $pattern = '/\/page\//'; // URLに「/page/」があるかチェック
            preg_match($pattern, $subject, $matches);
    
            if ($matches){
            //リクエストURLに「/page/」があれば、リダイレクトしない。
            $redirect_url = false;
            return $redirect_url;
            }
        }
    
    }

    続いて、ページネーションのほうは以下のようにする。

    <?php
    $paged = (int) get_query_var('paged'); // $pagedを定義。これがないとページネーションが動かないっぽい
    $wp_query = new WP_Query();
    $param = array(
      'post_type' => 'hoge',
      'paged' => $paged
    );
    $wp_query->query($param);
    if($wp_query->have_posts()):
    while($wp_query->have_posts()) : $wp_query->the_post();
    ?>
    ここで記事をループさせる
    <?php endwhile; endif; ?>
    
    <?php
    if ($wp_query->max_num_pages > 1): // ここからページネーション
    echo '<div class="new-pagenation">';
    echo paginate_links(array(
      'base' => get_pagenum_link(1) . '%_%',
      'format' => '?paged=%#%',
      'current' => max(1, $paged),
      'total' => $wp_query->max_num_pages,
      'next_text' => '次へ',
      'prev_text' => '前へ'
    ));
    echo '</div>';
    endif;
    ?>

    paginate_links()というナイスな関数を使うのが肝で、パラメータでURLのフォーマットを設定することができる。他にもいろいろパラメータを設定できる優れもので、僕もこんな関数があることを初めて知りました。具体的な使用方法はWordPress Codexを参照してください。

    次回以降普通のページネーションでもこれ使おう…

    あとは、paginate_links()で出力されるhtmlに合わせ、スタイリングしてやりましょう。

     

    以上、現場からでした。

    これでも動かない場合は、こっちも見てみてね。

    WordPress カスタム投稿でページネーションが404になる原因と解決法

  • jQuery メニューを開いているときはbodyのスクロールを禁止する

    jQuery メニューを開いているときはbodyのスクロールを禁止する

    スマホのハンバーガーメニューとかでメニューが開いているとき、bodyがスクロールするのが嫌な人が多いらしいので、スクロールできないようにする。

    よく実装する割にややこしいので、実装方法をメモ。




    実装

    $(function () {
      /*
      * Menu SP
      */
      var flag = false;
      $('.header-sp__menu a').on('click', function () {
        if (flag == false) {
          bodyFix(); // bodyを固定させる関数
    
          // その他、ナビを開くときに起きるあれこれを記述
    
          flag = true;
        } else {
          closeNavi();
          flag = false;
        }
      });
    });
    
    //ナビを閉じるときの関数
    function closeNavi() {
      bodyFixReset(); // body固定を解除する関数
    
      // その他、ナビを閉じるときに起きるあれこれを記述
    
    }
    
    //以下、bodyを固定する関数
    function bodyFix() {
      const scrollPosi = $(window).scrollTop();
      $('body').css({
        'position': 'fixed',
        'width': '100%',
        'z-index': '1',
        'top': -scrollPosi
      });
    }
    
    //以下、body固定を解除する関数
    function bodyFixReset() {
      const scrollPosi = $('body').offset().top;
      $('body').css({
        'position': 'relative',
        'width': 'auto',
        'top': 'auto'
      });
      //scroll位置を調整
      $('html, body').scrollTop(-scrollPosi);
    }

    bodyを固定する記述、bodyの固定を解除する記述をそれぞれ関数にして、メニューを開くボタンを押したとき、メニューを閉じるボタンを押したときにそれぞれ実行されるようにしています。

    メニューを閉じるときの処理は、いろんなボタンで行われる可能性があるので、使いまわせるように関数化。

    以前、以下の記事でflagを使わずにclickイベントを交互に制御する方法を書いたのですが、

    jQuery clickするごとに交互に処理を行う関数を作ってしまう

    例えば「ハンバーガーメニューをタップするとメニューが開き、閉じるときはメニュー内の”閉じるボタン”をクリックする」のように、別のボタン間で開閉を制御してやる必要がある場合は使えないので、素直にflagを使ってます。

    メニューの開閉、意外とややこしいよね。

     

    以上、現場からでした。

  • WP-Membersの閲覧制限で、カスタムフィールドも非表示にする方法

    WP-Membersの閲覧制限で、カスタムフィールドも非表示にする方法

    WordPressで会員制サイトを作るためのプラグイン「WP-Members」、めっちゃ便利ですねこれ。

    会員登録機能も簡単に作れて、記事に閲覧制限もかけられる。

    ただし、閲覧制限で非表示になる部分は投稿コンテンツ(the_content();)のみなので、カスタムフィールドを使っている場合、カスタムフィールドにも閲覧制限設定を実装する必要があります。

    そんなに難しくないので、サクッとやっちゃいましょう。




    実装

    まず、「記事に閲覧制限をかけているかどうか」を取得します。下記を記事用テンプレートに記述。

    $block_flag = get_post_meta($post->ID, '_wpmem_block', true); // 閲覧制限のチェック

    閲覧制限がかかっていると、”$block_flag”に”1″が、かかっていないと”0″が入ります。

     

    続いて、カスタムフィールドの出力を制御します。

    if( !$block_flag || is_user_logged_in() ) {
      // ここに書かれたものは、「閲覧制限がない」または「ログインしているとき」に表示される
    }

    ややこしい言い回しになってしまいましたが、要するに「閲覧制限をかけていない場合か、ログインしている場合に表示される」というわけで、この中に書いたものは、閲覧制限で非表示になります。

    これを、カスタムフィールドが出力される場所ごとに書いてもいいんですが、面倒だし見づらくなるので、まとめちゃいましょう。

    例えばこんな感じ

    $block_flag = get_post_meta($post->ID, '_wpmem_block', true); // 閲覧制限のチェック
    
    if( !$block_flag || is_user_logged_in() ) {
      // カスタムフィールドの値を先に全部取得しとく
      $custom_url = get_field('custom_url');
      $custom_client = get_field('custom_client');
      $custom_editor = get_field('custom_editor');
    }
    
    // 以下、出力部分
    if( $custom_url ) {
      echo $custom_url;
    }
    if( $custom_client ) {
      echo $custom_editor;
    }
    if( $custom_editor ) {
      echo $custom_editor;
    }

    これで、「ログインしていないとそもそもカスタムフィールドの値を取得しない。カスタムフィールドの値がなければ、出力もされない」というロジックになりますので、コード量を大幅に削減でき、見やすくなります。

    この方法がまかり通らない場合(リピーターフィールド等)は、仕方ないので別個対応してあげましょう。

     

    以上、現場からでした。

  • シンプルに選ぶ。Web系セミナーやイベントの探し方

    シンプルに選ぶ。Web系セミナーやイベントの探し方

    WebやIT系のイベントに参加したくて、イベント情報を探してみるものの、なんかいっぱいサービスあるし結局どれがいいのかわからない。

    ググっても「イベント情報サービスまとめ23選!」とか、いやいや23個も紹介されても結局どれやねん、そんな登録するかいなってなりますよね。

    というわけで、今回はいろんなサービスを見比べるのが嫌いな僕が登録している情報サービスたった4つプラスおまけと、それぞれのポイントを書いていきます。

    今回紹介するサービス、メインは以下の2つ

    • TECH PLAY
    • connpass

    そして流れで登録することになった以下2つ

    • Meetup
    • Doorkeeper

    さらに、おまけとしてTwitterでイベント情報を仕入れる方法を紹介します。




    サービスで探す

    TECH PLAY

    TECH PLAYのいいところは、自分の興味あるジャンルをタグとして登録しておくと、そのタグに合ったイベントがカレンダーで表示されるという点。

    めっちゃ見やすいです。

    さらに、タグに合うイベントが公開されたことをデスクトップ通知で知らせてくれます。

    都内だったらほぼ毎日あるんちゃうかってくらいイベント登録されてます。地方はあんまり載ってないかな。

    connpass

    connpassのいいところは、TwitterやFacebookと連携しておくと、同じくSNSを連携しているフォロワーさんがイベントに参加したときに通知してくれるという点。

    このイベントどうなんやろなー行く価値あるか…あ、でもあの人が行くなら大丈夫そうやし、行ってみるか!ってなるのが強いですね。

    一度参加したイベントや、お気に入りのイベントをフォローできて、そのイベントがお知らせを出したときに通知が来たり、似たようなイベントをおすすめで出してくれたりと、使い勝手もすごくいいです。

    ちなみに、大人気の人が参加するイベントはすぐ埋まるみたいです。

    Meetup

    Meetupは、WebやITよりはもっと一般ピーポーが集まるようなイベントが多めで、街コンとか異文化コミュニケーションみたいなのも多いです。グローバルな印象が強いですね。

    僕がMeetupに登録しているのは、WordPress Meetup Kansai というイベントがこのサービスで情報を出しているからです。かなり大規模でおもしろいイベントなので、WordPress好きな人はぜひ参加してみてください。

    余談ですが、Word Campも一回行ってみたいですね。

    Doorkeeper

    CSS Niteという、Web系イベントでは大御所のイベントがこのDoorkeeperというサービスを使って募集していることが多いので、登録しました。今のところ他の用途では使ってません。



    Twitterを使って情報収集

    これはツイ廃の人にはぜひやってみてほしいんですが、Twitterアプリには、フォローしてる人がツイートするとプッシュ通知で知らせてくれるという機能があります。

    これを利用して、よくいい感じのイベントを開催しているグループのアカウントをフォローし、その通知を受け取るようにしておけば、旬な情報がたちどころにわかるというわけです。

    僕は、上記のCSS Niteのアカウントをフォローして通知を受け取っています。

     

    おわり

    こんな感じで、あれやこれやと情報収集をしていてはキリがないので、いい感じにポイントで絞って探してみましょう。「このサービスに登録していないせいで、人生の半分を損した!」みたいなことはそうそうないので、どれも全部見なきゃいけないとか思わなくて大丈夫。

    参加しなかったイベントでも、とんでもなくいい情報があれば、それはどこかで出回ります。

    それよりも、参加することに意義がある。特に、「あの人が行くから行ってみよう」っていうのは、参加するにあたって大きなポイントになると思うので、connpassはマジでオススメです。

    会場でしれっと「あ、奇遇ですね~😯」みたいにとぼけてみるのもおもしろいかもしれません。楽しみましょう。

    ではでは、良いイベントに参加しましょうね~。

  • WP_Queryで「タイトルもしくはカスタムフィールドに一致したら」という条件で検索

    WP_Queryで「タイトルもしくはカスタムフィールドに一致したら」という条件で検索

    WP_Queryでループの検索条件を文字列で絞り込むとき、だいたい以下のように書くと思います。

    <?php
    $wp_query = new WP_Query();
    $param = array(
      'posts_per_page' => '5',
      'post_type' => 'post',
      's' => '検索用テキスト',
      'post_status' => 'publish',
    );
    $wp_query->query($param); if($wp_query->have_posts()):
    // ここに出力を書く
    endwhile; endif; wp_reset_query();
    ?>

    普通は’s’のところに、検索のための文字列を入れますよね。

    ただ、これはデフォルトだとタイトルと投稿内容しか対象にならない。「カスタムフィールドも検索対象にしたいんじゃ!」ってこと、あると思います。

    ここで’s’も’meta_query’も普通に使っちゃうと、AND検索になります。なので、例えば「東京駅」で検索かけたときに、カスタムフィールドには入ってるけどタイトルには入ってないから検索結果に出ないということになっちゃうんですよね。それじゃ困る。

    「タイトルか、もしくはカスタムフィールドにあれば表示する」というOR検索にしたいわけです。

    そんなときは、こうしましょう。




    実装

    以下コードをfunctions.phpに記述

    add_action( 'pre_get_posts', function( $q )
    {
        if( $title = $q->get( '_meta_or_title' ) )
        {
            add_filter( 'get_meta_sql', function( $sql ) use ( $title )
            {
                global $wpdb;
    
                // Only run once:
                static $nr = 0; 
                if( 0 != $nr++ ) return $sql;
    
                // Modify WHERE part:
                $sql['where'] = sprintf(
                    " AND ( %s OR %s ) ",
                    $wpdb->prepare( "{$wpdb->posts}.post_title = '%s'", $title ),
                    mb_substr( $sql['where'], 5, mb_strlen( $sql['where'] ) )
                );
                return $sql;
            });
        }
    });

    そしてループの条件を以下のようにします。これは、カスタムフィールド「station」もしくはタイトルで、「東京駅」という単語でOR検索をかけるときの例。

    <?php
    $wp_query = new WP_Query();
    $param = array(
      'posts_per_page' => '5',
      'post_type' => 'post',
      'post_status' => 'publish',
      '_meta_or_title' => '東京駅',
      'meta_query' => array(
        array(
          'key' => 'station', // 検索をかけるカスタムフィールドのkey
          'value' => '東京駅',
          'compare' => 'LIKE'
        )
      )
    );
    $wp_query->query($param); if($wp_query->have_posts()):
    // ここに出力を書く
    endwhile; endif; wp_reset_query();
    ?>

    これでヨシ!

    以上、現場からでした。

  • フリーランスがイベントやセミナーに参加することのメリット

    フリーランスがイベントやセミナーに参加することのメリット

    この間、「Webデザイントレンド in 大阪 2019」というセミナーに参加してきました。

    フリーランスになってから、セミナーに参加するのは3回目で、京都に来てからは2回目(1回目はセミナーというより身内のパーティみたいな感じで、アウェイでした…)なんですが、久々に参加してみて「あー、やっぱいいな。もっと参加しよ」と思えたので、フリーランスがセミナーやイベントに参加するメリットというか、良さみたいなものを書いてみます。




    セミナーやイベントに参加するメリット

    フリーランスがセミナーやイベントに参加するメリットは、以下のようなものです。

    • 最新技術・知らない技術に触れられる
    • 他のフリーランスや経営者の話が聞ける
    • 仕事につながる可能性がある
    • 人と話せる
    • 酒が飲める

    順に見ていきましょう。

    最新技術・知らない技術に触れられる

    フリーランスはだいたい一人でずっとやってますので、新しい技術だったり、知らない便利な技術だったりは、意識して日々情報収集していないとなかなか触れる機会がないです。これは、会社員でも同じですね。

    気を付けて勉強しているつもりでも、やはり知らないものは知らないです。イベントやセミナーに定期的に参加していると、そんな便利な技術があったのかーと驚かされることが多々あります。

    今は普通に使っているSassやEmmetも、最初はセミナーに行くまで知りませんでしたからね。

    他のフリーランスや経営者の話が聞ける

    これがけっこう重要で、フリーランスやってると、他のフリーランスや経営者がどうやって事業を行っているのか気になるんですよね。

    自分は今自分の思う方法でとりあえず成功しているようだけど、本当はもっと効率のいいやり方とか、もっと楽な稼ぎ方とか楽しい仕事があるんじゃないかと思います。

    そんな中、先輩フリーランスや経営者の話が聞けるのはとても貴重です。この間のセミナーでも、フリーでイラストレーターを13年やってる大先輩とたまたまお話をする機会があって、すごく勉強になりました。しかもこの方、京都の方で、今度飲みに行きましょうと誘っていただきました😋 もっと濃い話が聞けそうですね!

    Twitterでもいろんなすごそうな人がなんかよさげなことを言ってますが、そのだいたいはポジショントークと呼ばれるもので、拡散目的である場合が多いです。本当に大事なことはなかなか言わないし、夢のない現実的なことは拡散されないんですよね。

    直接、成功している人に聞くのが一番です。仲良くなれば、親身に相談に乗ってくれるかもしれません。

    仕事につながる可能性がある

    これは、僕も実際にセミナーで知り合った方から案件をもらい、今でも継続的にお付き合いさせていただいているという例があります。

    セミナーやイベントって直接話をするので、相手がどういう人なのかがわかりやすいです。

    で、仕事をしていくうえで重要なのって、技術力とか仕事能力だと思っている人が多いと思うんですが(もちろんそれも大事ですが)、フリーランスが一番重要視されやすいのは「この人と仕事がしたいかどうか」なんだと思うんですよね。特に、相手もフリーランスの場合は。

    この人ならちゃんとやってくれそう、仕事できそう、変なこと言わなそう、みたいなことが、直接話すことによって伝わります。どうせやるなら楽しくやりたいじゃないですか。

    ただ、そもそも仕事をとる気でセミナーやイベントに参加するのはオススメしません。あーなんかこの人、仕事ないんかな…ガツガツしててめんどいな…って思われる可能性が高いです。僕なら思います。なんかダメっぽいなって。

    人と話せる

    フリーランス、特に在宅フリーランスは、孤独です。だいたい家にひきこもってますので、人と話すことがあまりないです。冗談抜きで声量がどんどん小さくなっていってます

    セミナーやイベントに参加すると、人と話せます。人と話すのが苦手だから絶対に話したくないって人は…まぁ行かなくていいと思うんですけど、フリーランスには向いてないんじゃないですかね。コミュニケーションなしでどうやって仕事もらうんでしょうか。人と話すことなく、人のためになる仕事ができるでしょうか。

    僕も話すのは苦手なほうですが、嫌いなわけじゃないんです。苦手だけど、話したい。イベント、話す、楽しい。

    酒が飲める

    酒が飲めるぞ!!

    まぁ酒が別に好きじゃない人はどうでもいいと思いますが、僕は好きです。特に、人と飲む酒はおいしい。家でもちょっとは飲みますが、そういうのとはまた違う楽しさがありますからね。

    会社員だったら会社の飲み会があると思うんですが、フリーランスになったらそういうのないし、京都に来て知り合いが全くいないので誰かと飲むなんてことはセミナー以外ほぼないです。

    むしろ誰か飲みませんか?コミュ障でよければ。



    おわり

    以上、フリーランスがセミナーやイベントに行くすばらしさを語ってみました。

    今度からは、月1回か2回くらいの勢いで行きたいです。京都ではあんまりIT系のイベントないんですが、大阪が近くなったので、関西圏のイベントなら軽率に参加できそうですしね。平日でもがんばれば行ける。

    行きたいのはやまやまだけど、セミナーやイベントの情報はどっから拾ってくんねんってことですが、それはまた別の記事でまとめたいと思います!

    ではでは、ハッピーなイベントライフを!

  • jQuery clickするごとに交互に処理を行う関数を作ってしまう

    jQuery clickするごとに交互に処理を行う関数を作ってしまう

    jQueryで’click()’というと、クリックしたときのイベント処理を行うメソッド。

    例えば以下のように使います

    <script>
        $('button').on('click', function() {
            alert('クリックしたぞ');
        })
    </script>

    しかし、これだけでは「クリックするごとに交互に処理を行う」というときに、若干めんどくさい。アコーディオンとかね。

    slideToggleとかtoggleClassでなんとかなるレベルの処理ならいいけど、それ以上のこと、例えばテキストを変えたりしなきゃいけないとき、よく紹介されているのは、なんかflagをfalseにしといて、1回クリックされたらflagをtrueにして、もしflagがtrueだったときはこっちの処理を…とかもうややこしいので、もっとシンプルにやりたい。そうだ、どうせなら関数を作ってしまおうよ。




    関数を作る

    こんな感じで関数を作りましょう

    $.fn.clickToggle = function (a, b) {
      return this.each(function () {
        var clicked = false;
        $(this).on('click', function () {
          clicked = !clicked;
          if (clicked) {
            return a.apply(this, arguments);
          }
          return b.apply(this, arguments);
        });
      });
    };

    これで、’clickToggle()‘という関数が使えるようになりました!関数は一度作ってしまえばどこでも使えます。

    使う

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

    $('button').clickToggle(function () {
      // 1回目のクリック
      $(this).next('.target').slideDown(300);
      $(this).text('閉じる');
    }, function () {
      // 2回目のクリック
      $(this).next('.target').slideUp(300);
      $(this).text('開く');
    });

    だいぶすっきり書けますね!’hover’とだいたい同じような書き方になる。

     

    昔は’toggle()’という超便利な関数があったんですが、jQuery2以上から使えなくなりました。今でも普通に紹介されている記事いっぱいありますが、使えません。気をつけましょう

    現場からは以上です。

  • WordPress カスタム投稿でページネーションが404になる原因と解決法

    WordPress カスタム投稿でページネーションが404になる原因と解決法

    WordPressで、「カスタム投稿タイプのページネーション2ページ目以降(2ページ目以降じゃなくても、nページ目以降で)が404になる」という現象にちょいちょい陥ったことがあるものの、いつもその場しのぎの応急処置しかしていなかったけど、今回それじゃだめな仕様を実装しなければいけなくなったので、その原因とちゃんとした解決法を調べた。




    現象が発生する条件

    この現象が発生するのは以下のとき。

    1. カスタム投稿タイプの一覧ページで、
    2. WP_Queryによる定義を行っており、
    3. ‘posts_per_page’で1ページの記事表示数を指定していて、
    4. 管理画面の「設定→表示→1ページに表示する最大投稿数」で設定した数値より3の数値のほうが小さいとき。

    つまり、管理画面で「1ページに表示する最大投稿数」を10にしていて、カスタム投稿タイプ”shop”の表示数を5とかにしたい場合、ページネーションがうまく機能しなくなる。

     

    原因

    この原因は、かいつまんで言うと

    WordPressさんが、表示させるテンプレートを決定する前に、管理画面から設定した値を参照する。このときはまだそのテンプレートに書かれたquery_postsは読まれていない。

    そして、テンプレートが読まれquery_postsが読まれた段階でも管理画面から設定した値は参照されたままになっており、2つの値がぶつかり合う

    という感じのようです。

    つまり、例えば

    • デフォルト投稿記事数が20
    • 管理画面からの設定数が10

    だった場合、デフォルト投稿は2ページ目まで表示されます。

    そしてなんと、カスタム投稿タイプもこれに合わせて2ページ目までしか表示されないということらしいです。

    カスタム投稿の記事数が30,管理画面の設定数が5だとしても、どんな値でもデフォルト投稿のページ数になってしまう。

    そういうことか。。。一見ほとんどバグじゃないかと思いますが、WordPressの仕様らしいのでしょうがないですね。

    しょうがないので、解決してみましょう。

     

    応急処置

    ググったらよく出てくるやつ。

    管理画面の最大投稿数を1にする

    シンプルでいいです。確かにこれなら理論上いけますね。

    簡単なテーマやサイトであればこれでいいと思いますが、「いや、それじゃ困る。なぜならデフォルト投稿の表示数も管理画面から設定できるようにしないといけないから」というパターン、あると思います。

    というわけで、もっと自然に解決する方法がこちら。

    自然に解決

    functions.phpに以下を記述

    <?php
    add_filter( 'parse_query', 'custom_per_page' );
    function custom_per_page( $query ) {
      if ( is_admin() || is_singular() || !is_main_query() ) { // 管理画面とsingleとメインループじゃない部分は除く
        return false;
      }
    
      if ( get_query_var( 'post_type' ) == 'event' ) {
          $query->set( 'posts_per_page', '6' );
      }
    }

    そして、テンプレート側では’posts_per_page’を指定しない

    カスタム投稿ごとに表示数を設定したい場合は、単純に増やせばOK

    <?php
    add_filter( 'parse_query', 'custom_per_page' );
    function custom_per_page( $query ) {
      if ( is_admin() || is_singular() || !is_main_query() ) { // 管理画面とsingleとメインループじゃない部分は除く
        return false;
      }
    
      if ( get_query_var( 'post_type' ) == 'event' ) {
          $query->set( 'posts_per_page', '6' );
      }
    
      if ( get_query_var( 'post_type' ) == 'blog' ) {
        $query->set( 'posts_per_page', '5' );
      }
    }

     

    以上、現場からでした。

    こっちの記事もどうぞ

    WordPress 固定ページ内でページネーションを使ったら404になる原因と対策

  • Web制作の効率爆上がり!超便利なChromeの拡張機能10選

    Web制作の効率爆上がり!超便利なChromeの拡張機能10選

    Web制作の際、ブラウザで表示や動作の確認をしますね。ブラウザにはコンソールという機能があり、ページ上の様々な情報を見たりデバッグを行ったりできますが、ブラウザの拡張機能を使えば、より効率的に制作を進めることができます。

    今回は、みなさんの仕事の効率化をお手伝いするべく、僕もよく使っている現場で役に立つGoogle Chromeの拡張機能たちをご紹介。

     

    今回紹介するのは以下の10個。ゆっくりしていってね!

    • Awesome Screenshot
    • ColorPick Eyedropper
    • Page Ruler
    • The QR Code Extension
    • HTMLエラーチェッカー
    • Google Analytics オプトアウト アドオン
    • Tag Assistant
    • Wappalyzer<
    • Web Maker
    • Save to Pocket




    Awesome Screenshot

    さっそくの大目玉、これはもう関わる人全員に使ってもらいたいという拡張機能。Awesome Screenshotは、画面のスクリーンショットを撮るための拡張機能。主に以下のような便利な機能があります。

    Capture visible part of page

    今映っている画面をキャプチャします。

    Delayed capture

    このボタンを押した後、数秒後にスクショを撮ります。マウスホバー時のアクションを記録したいときなんかに便利。

    Capture entire page

    1ページまるまるスクショを撮ることができます。

    Record screen

    開いているページ上でのアクションを録画することができます。無料版では30秒まで。

    さらに…

    これだけでも十分便利なんですが、この拡張機能の真骨頂はスクショを撮ったあと

    なんと、撮ったスクショをその場で編集できちゃうんです!やばい!

    具体的には、以下のようなことができます。

    トリミング

    スクショを撮った画像をその場でザクっとトリミングできる!

    テキスト、枠、矢印の書き込み

    その場でいろいろ書き込める!!

    ぼかし

    その場でぼかしを入れられる!!!

     

    どうですか?やばいですね。僕は残念ながらこの感動を表すほどの語彙力はありません。指示の作成からちょっとSNSにアップしたいとき、超捗りますね!

     

    ColorPick Eyedropper

    画面上の色をピックアップできる拡張機能。

    「この画像に色を合わせて」なんて言われたとき、わざわざ画像ダウンロードしてPhotoshopで開いてスポイトツールで色を拾って…なんてしなくていいんです。

    拡大されてピクセル単位で拾いやすい。

     

    Page Ruler

    画面内で使える物差しツール。

    サイズだけでなく、画面端からの距離なんかも見ることができます。

     

    The QR Code Extension

    今いるページのQRコードをでかでかと表示してくれる拡張機能。

    めっちゃでかいので、離れていてもスマホでスキャンできます。実機で表示確認したいときに便利!

     

    HTMLエラーチェッカー

    ページ内のHTML構造をチェックしてくれる拡張機能。

    「あれ!?CSS完璧なはずなのにめっちゃ崩れとるやん!!」ってときは、タグの閉じ忘れとかで構造がおかしくなっているときが多々あります。

    HTMLチェッカーで構造をチェックしてみましょう。エラーが出ていれば、わかりやすく教えてくれます。

     

    Google Analytics オプトアウト アドオン

    われわれWeb屋は、ページの表示確認や動作確認をするためにページを見て回ったりめっちゃリロードしますよね。

    そういったアクションをGoogle Analyticsに拾われると解析がぐちゃぐちゃになりますので、できれば自分のアクセスはカウントしないようにしたいところ。

    この拡張機能は、ONにしておくと自分のアクセスをGoogle Analyticsにカウントさせないことができます。スニーキングのようなものですね。

    エンジニアブログのアクセスが比較的少ないのは、みんなこれを入れているからに違いありません!!!!



    Tag Assistant

    今いるページで、Google系のタグ(タグマネージャ、Analytics、Adwords等)が正常に機能しているかを確認することができる拡張機能。

    Adwordsのコンバージョンタグを入れている場合は、どのような値が送信されているかを詳しく知ることができます。

    注意点として、上で紹介した「Google Analytics オプトアウト アドオン」を有効にしているとうまく計測されないため、使うときはGoogle Analytics オプトアウト アドオンをオフにするか、シークレットモードで必要な拡張機能だけ有効にして使うと効率的。

     

    Wappalyzer

    今のページの、表からはぱっと見わからない情報を知ることができる拡張機能。

    使っているCMSや言語、サーバー、データベースの種類等、丸見え!

    「このサイト、何で作られてるかわかりますか?」って言われたとき、「たぶんWordPressだと思います」って言えますね!

    地味にすごい。

     

    Web Maker

    これはもう拡張機能というかWebアプリなんですが、ブラウザ上でコードを書いて即座に表示確認できるという神ツール。

    ブラウザ越しにいる誰かに説明するときとか、ちょっと実験してみたいことがあるときとか、いちいちローカル環境構築してとかやってるとしんどいときに使える。

    ライブラリもサクッと導入可能。

    何気にEmmetも使える。

    使い方は無限大です。これを説明しようとするとこれだけで1記事書けるくらいの規模なので、ぜひ皆さんの目で確かめてみてください。

     

    Save to Pocket

    「Pocket」というのはいわゆるブックマークサービスで、「このページええやん!あとでもっかい見よ!」ということができるものです。はてブとは違い、誰かとシェアしたりすることなくこっそり自分だけのリストが作れて、編集も楽という理由で最近よく使っています。

    僕のブログの記事は、はてブよりPocketのほうが多くつく印象です。ちょっとメモして、あとでまた見ようという感じですかね。

     

    話は逸れましたが、こちらはそのPocketをツールバーからワンクリックでブックマークできる拡張機能です。はてブにもありますね。

    これがあれば、PocketのシェアボタンがないサイトでもPocketすることができます。




    おわり

    こんな感じで、ChromeにはWeb制作に役立つツールがいっぱいあります。

    僕も知らないことが多いので、他にもオススメがあれば教えてください!

     

    コーディングも爆速でやって、さっさと定時で帰ってやりましょう!

    初心者がコーディングを3倍速くするために知っておきたい6つの技術

     

    それでは、マッハなWeb制作ライフを。

  • WordPress 「カスタマイズ」内のメニューを非表示にする方法

    WordPress 「カスタマイズ」内のメニューを非表示にする方法

    WordPressの管理画面、「外観→カスタマイズ」内にデフォルトで表示されているメニューたちを非表示にする方法。テーマによって追加で表示されている項目を非表示にする方法も添えて。

    なんだか苦戦しがちな「メニュー」項目も非表示にできました。




    実装

    functions.phpに以下を記述

    // カスタマイズからメニューを削除
    function my_custom_customizer( $wp_customize ) {
      $wp_customize->remove_section( 'add_menu' ); // メニュー
      $wp_customize->remove_panel( 'widgets' ); // ウィジェット
      $wp_customize->remove_section( 'colors' ); // 色
      $wp_customize->remove_section( 'static_front_page' ); // 固定フロントページ
      $wp_customize->remove_section( 'title_tagline' ); // サイト基本情報
      $wp_customize->remove_section( 'custom_css' ); // 追加CSS
    }
    add_action( 'customize_register', 'my_custom_customizer', 20 );

     

    テーマによっては他のメニューもあるかもしれないですね。そんなときは、以下のような流れで実装しましょう。

    カスタマイズ画面でコンソールを開く

    カスタマイズ画面でF12を押して、コンソールを開きます(Chrome)。

    ①非表示にしたい項目にカーソルを合わせ、
    ②<li>のソースを見てみましょう。

    例えば以下のようになってると思います。

    <li id="accordion-section-skin_section" class="...">
    

    この<li>のidが重要。

    今回の場合、

    accordion-section_skin_section

    黄色マーカーの部分”skin_section”を抜粋しremove_section()の引数とします。

    $wp_customize->remove_section( 'skin_section' );

    ちなみに、赤の部分がsectionではなくpanelだった場合、こうなります。

    $wp_customize->remove_panel( 'skin_section' );

     

    これでだいたいどんな項目も非表示にできますね!

    現場からは以上です。

  • WordPress ajaxがスマホで動かないとき、原因は全然違うところにあった

    WordPress ajaxがスマホで動かないとき、原因は全然違うところにあった

    WordPressでajax実装したのはいいけど、スマホで実機確認したら動いてない!読み込みに失敗してる!

    PCで動いてスマホで動かないってどういうことやねん…ajaxやぞ…そんなことあんのか…

    と長い間悩んでましたが、全然違うところに原因があってしんどかったという話です。




     

    管理画面にログインしているかどうかが問題だった

    スマホで動いてないのではなく、管理画面にログインしてないときに動いてなかったのです。なんてこった…ずっとログインしたまま作業してたからね…

     

    というわけで、管理画面にログインしてないときに動かない場合に見る部分はこちらです。

    /**
     * Ajax実装部分
     */
    function my_ajax_scroll() {
      // ここに処理を書く
    }
    add_action('wp_ajax_my_ajax_scroll', 'my_ajax_scroll');
    add_action('wp_ajax_nopriv_my_ajax_scroll', 'my_ajax_scroll');

    WordPressでAjaxを使うとき、functionsにこんな感じで関数を書き、add_actionしますね。
    この”wp_ajax_nopriv”のほうは「ログインしていないとき」に有効なadd_actionで、ここを忘れてたり間違えてたりすると、ログインしていない状態でうまくajax通信ができないということでした。

    以上、現場からでした。

  • レスポンシブコーディングで早めに知っておきたい便利な小技まとめ

    レスポンシブコーディングで早めに知っておきたい便利な小技まとめ

    コーディングを始めたての頃は、レスポンシブでかなり苦戦すると思います。僕がWeb制作をやりはじめたころは、まだレスポンシブはそこまで一般的というわけでもなく、同じく苦戦しました。

    ただ、今はレスポンシブじゃないほうがおかしいというほどレスポンシブが当たり前の時代になっていて、それまで苦戦していたことが今では楽に実装できるようになっています。

    この記事では、僕がレスポンシブの際、もっと早くこの技術を使うことができていれば…と思った小技たちを紹介していきます。




    picture要素

    picture要素とは、HTML5.1から追加されたタグの一つで、これを使うと画面の横幅に合わせ、画像の切り替えができるようになります。

    以下のように書きます

    <picture>
      <source media="(max-width: 1200px)" srcset="common/img/hoge_m.png">
      <source media="(max-width: 750px)" srcset="common/img/hoge_sp.png">
      <img src="common/img/hoge.png" alt="hoge" width="1920">
    </picture>

    オリジナルのimgをpictureタグで囲み、”source”要素でそれぞれの横幅に合わせた画像を指定。これだけで、各横幅に最適化された画像を自動で切り替えることができます。

    今までは、imgを複数並べてclass=”sp”,class=”pc”とかつけて、cssでdisplayで切り替えて…とかめんどいことをやってましたが、これならhtml書くだけで済むので楽ですよね。

    srcset

    上記pictureを使用するのは、基本的に画面幅で画像そのものが切り替わる(縦横比が違ったりする)場合のみに推奨されています。

    ただ単に、デバイスによって表示させる画像のサイズのみを切り替えたい場合、img要素にsrcsetを使うことで対応します。

    <img src="img/hoge.png" srcset="img/hoge-320.png 320w, img/hoge-640.png 640w" alt="hoge">

    picture要素、ぜひ覚えておきましょう。IE11では使えないことになってますが、スマホにIEはないので全く問題ないです。(未対応ブラウザではimg srcのみが表示される)

     

    単位”vw”

    cssで使う数値の単位として、px、%、em等いろいろありますが、その中でもレスポンシブのときとびきり便利なのがこの”vw”。

    こいつはどういう単位かというと、

    1vw = (ウィンドウの横幅)*1%

    ということで、ウィンドウ幅に合わせて可変する単位です。

    ほんなら%でよくない?と思われるかもしれませんが、まぁ聞いてください。まず、%だと「親要素の幅」に依存します。そして、だいたいはwidthであれば親要素のwidth、heightであれば親要素のheightに依存しますよね。

    しかし、vwの場合は「ウィンドウ幅」なのです!ウィンドウ幅の言うことしか聞きません。(ウィンドウの高さに依存したい場合は、vhを使いますが、こっちはあまり使いません)

    更にいうならこのvwの便利なところは、縦方向の指定とフォントサイズにあるのです。

    縦方向の指定

    いや横幅ちゃうんかい!

    そう思われても無理はありません。しかしこのvw、縦方向の指定に真価を発揮するのです。

    例えば、特定の要素にbackgroudを指定して、横:縦が4:3の比率を保ったままレスポンシブに対応させたい場合、今まではこんなめんどくさいことをしていました。

    .hoge {
      width: 100%;
      height: 0%;
      padding-top: 75%;
    }

    「heightを0にして、padding-topで横幅に対する比率を記述する」

    めんどくさっ!しかもこれ、実質縦幅がゼロなので、この中に何か要素入れたいときはabsolute配置しなきゃいけないという…めんどくさっ!!

    しかしvwを使えばこの通り。

    .hoge {
      width: 100%;
      height: 75vw;
    }

    要素の横幅は画面幅の100%だとすれば、縦幅は画面幅の75%、つまり75vwということになります。これであれば縦幅もちゃんとありますので、普通に使える。神だなー。

    これを知らない時代は相当大変でした。しかもvwを知った当時、なぜかvwの使用は推奨されていませんでした。なんでかはわかりません。

    これはiframeとかにも使えますので、Google Mapの表示調整にも便利。

    フォントサイズ

    例えば以下のように、画像の上にテキストを乗っけるパターン。

    これを「縦横比そのまま、テキストの配置もサイズもそのままでレスポンシブ対応」って言われたらどうしますか?各画面幅に合わせて細かくメディアクエリを分けて調整します?「1枚の画像にしろや!」ってなりますよね。

    しかしフォントサイズにvwを使えば、画面幅に依存するので、割と簡単に実装できます。

    まぁそれでも「画像にしろや!」とはなりますけどね。いいじゃんこんなん画像で。偉い人はやたらテキストにしたがるんです。

    注意点として、vwを使ったとことろで各ブラウザごとの最小フォントサイズ制限には逆らえないので、もしフォントサイズが小さすぎる場合は、そこは技術的に厳しいですと言ってあげましょう。

    transform: scale(); を使えば…いや、聞かなかったことにしましょう。できないんです。いいね?

     

    @media only screen and (min-width: )

    レスポンシブというと、

    @media only screen and (max-width: 750)

    と「ある横幅以下なら」という記述ばかり使いがちですが、その逆、「ある横幅以上なら」を記述する

    @media only screen and (min-width: 751)

    もめっちゃ便利なんです。つい忘れがちですけどね。

    例えば、以下のような場合によく使います。

    • hoverのとき。スマホではhoverは使わない。むしろ使うとSafariでバグることがあるし。
    • PCでは電話番号のリンクを無効にしたいとき。
    • モバイルファーストのとき。
    • PCの場合は3列並びの3つ目だけmargin-rightをなくしたい(:nth-childを使う)が、スマホの場合は2列なので3列目のmargin-rightをなくしたのを打ち消した上で2列目のmargin-rightをなくしたいとき

    基本的に、max-widthばっかり使うと「PC用に書いたCSSを上書きしなきゃいけない」わけですが、min-widthもちゃんと使ってやれば、切り替えがよりスムーズになります。



    おわり

    いやー便利になりましたよね。難しいと思われていたレスポンシブコーディングも、今や当たり前の技術なわけで。

    技術はどんどん新しく便利になっていってますので、できるだけ新しい技術を学んでいきたいところ。ネットでググるだけの独学でコーディングをやっていると、けっこう古い記事を参考にしちゃうことがよくあります。

    僕も古い技術に縛られたおじさんの一人なので、新しい技術を吸収しようとがんばってる毎日です。まだまだ思いついたものがあればどんどん書き足していきますので、こんなんも紹介してくださいってのがあったら教えてくださいね!

     

    ではでは、良いコーディングライフを。

  • VS Codeのユーザースニペットで「$(ドル記号)」を文字列として出力させる

    VS Codeのユーザースニペットで「$(ドル記号)」を文字列として出力させる

    Visual Studio Codeの便利な機能の一つ「ユーザースニペット」。




    こちらjsonファイルにソースを書いて管理するわけですが、”$”には特別な用途がありますよね。

    例えば以下のように書くと、

    "Get Template Part": {
    	"prefix": "_gtp",
    	"body": [
    		"<?php get_template_part('$1'); ?>"
    	]
    }

    ‘_gtp’と書いてTabキーを押すと'<?php get_template_part(‘$1’); ?>’が出力され、
    さらに’$1’の位置に自動でカーソルが持っていかれるという機能。

    しかしこれでは、例えばphpの変数’$hoge’を出力させることができない。困った。
    バックスラッシュ’\’でエスケープできるかと思いきや、この’$’についてはなぜかできないもよう。

    で、しばらく諦めてたんですが、ついに解決しました。以下のようにバックスラッシュを2つ使ってエスケープするみたいです。

    \\$

    これでヨシ!

  • そのSEO業者大丈夫?依頼する前に読んでほしいGoogleのこれ

    そのSEO業者大丈夫?依頼する前に読んでほしいGoogleのこれ

    「SEOのこと全然わからんからSEO業者に頼もうか」

    わかります。しかしちょっと待ってください。世の中にはほとんど効果のない対策の提案で報酬を貪る業者や、確かに効果はあるかもしれないけど、バレたらペナルティを請けて大損害を被るような対策を行う業者がいます。けっこういます。




    この件について、Googleがだいぶキレ気味で勧告を出しています。それが以下のページ。

    こちらのページには、Googleが提唱するSEOの本質や、SEO業者の必要性、危険性、選び方などがGoogle自身によって説明されていますので、SEOを行う場合はまず読んでみてください。「え?これ効果あるって言われてめっちゃお金払ったんだけど、効果ないの?」ってことがけっこう書かれているかもしれません。SEOってそういう闇が深い世界なんです。こわいですねー

    また、SEOのスタートガイドもありますので、まったくわからない人はとりあえずGoogleの推奨するSEOを実行するところから始めてみてはいかがでしょうか。読んでおくだけでも、結局SEO業者に頼んだときに「いやそれGoogleスタートガイドに書いとることそのまま言っとるだけやん」ってなりますので、余計な費用をかけずに済みますよ。

     

    Web屋としてこんなこと言うのもなんですが、SEO業者に頼むのはほぼ無駄であることが多いです。SEOのほとんどって、Googleのガイドライン見たら書いてあるんですよね。

    もちろんしっかりしたSEO業者は、ちゃんとやってくれます。

    例えば、たった一つのサイトをビッグワードで上位にするため、かなり濃いメディアサイトをいくつも立ち上げて関連付けるとかやってる業者さんもいます。どのサイトも内部SEOがこれでもかというくらい充実しています。こういうのって、社内だけではなかなかできないですよね。

    Googleの注意を聞いて、ちゃんとしたSEO業者を選びましょうね!

    現場からは以上です。

  • VS Code 複数行選択できる「マルチカーソル」まとめ

    VS Code 複数行選択できる「マルチカーソル」まとめ

    以前、↓の記事でちょろっと紹介したマルチカーソルですが、

    初心者がコーディングを3倍速くするために知っておきたい6つの技術

    Visual Studio Codeでは便利なマルチカーソルのショートカットがいっぱいあるよということを知ったので、紹介したいと思います。

    WindowsもMacも両方書いていきますので、参考になればうれしいです。




    選択した文字列と同じものを順番に検索

    ドラッグとかで選択した文字列と同じものを、現在の位置から順番に検索し、同じく選択していく。ちなみに、Shift + 方向キー(Windows)で選択できるって知ってました?

    Windows: Ctrl+ D
    Mac: command + D

    選択した文字列と同じものを一気に検索

    こちらは同ファイル内にある同じ文字列を一気に検索し、全部選択する。
    Ctrl+Cでコピーし、Ctrl+Fで検索窓を開いて一気に置換ということもできるので、一括置換したい場合はそっちのほうが便利かも。

    Windows: Ctrl + Shift + L
    Mac: command + shift + L

    カーソルを手動で1個ずつ追加

    好きなところにカーソルを追加していき、一括で編集できる。手が滑って別のとこに追加しちゃったよって場合でも、同じ場所で再度キーを叩くとカーソルが消える。

    Windows: Alt + クリック
    Mac: command + クリック

    選択した行の末尾にカーソルを追加

    ドラッグで選択した複数行の末尾にカーソルを追加できる。その状態でHomeキーを叩けば、行の先頭にカーソルが移動する。

    Windows: Alt + Shift + I
    Mac: option + shift + I

    おわり

    マルチカーソルは、駆使すればコーディングにかかる時間を大幅に削減できます。例えば、都道府県の市区町村のリストを配列に入れたいとかなった場合、まともにやってたら腱鞘炎になるレベルですが、マルチカーソルを使えば楽にできますね。

    以上、現場からでした。