かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

WordPress テンプレートをまたいで使えるグローバル変数を作りたい。

header.phpfooter.phpなど別れているテンプレートで共通の表示や値を使いたい時、ハードコーディンしてると修正があった時面倒とか、管理画面から入力された値を使って出力したい場合、共通の変数にしてテンプレートで使いまわせると便利かもしれません。

global変数を作る

WordPressPHPでできていて全ページでfunction.phpが使われているので、ここにglobal変数を設定してしまえば、header.phpとかsingle.phpとかのテンプレート内でもこの変数を使うことができます。

■ function.php

<?php // function.php
function my_setup() {
  global $my_global_var;
  $my_global_var = "たーのしー!";
}
add_action( 'after_setup_theme', my_setup );

下記のようにfunction.phpのトップレベルのスコープに変数定義を書いてもWordPressグローバル変数になるようです。

<?php // function.php
$my_global_var = "たーのしー!";

■ header.php や single.php などのテンプレートで使う

<?php
global $my_global_var;
echo  $my_global_var; // "たーのしー!"

当然WordPressのglobal変数や使用しているプラグインの変数を書換えてしまう可能性もあるので、変数を取得できる関数を作成する方が安全だとは思います。
独自のglobal変数を使う場合はWordPressのglobal変数を汚染しないようにprefixなどを付けた変数名を付けるのが良いと思います。


[参考]

国連でも通じる 世界の非ネイティブ英語術

国連でも通じる 世界の非ネイティブ英語術

WordPress ページを使用しているテンプレートから取得したい

固定ページを取得したい時、ページ名が決まりきっているならget_page_by_title( $page_title )を使うのが手っ取り早いです。( get_page( $page_ID ) はテスト環境・本番環境で制作してると両者でIDが違ったりするので使いづらい )

しかしながら、get_page_by_title()もページ名で取得するので管理画面に入力された値に依存するハードコーディングな訳ですから管理画面からページのタイトルを変更されてしまうとエラーになる可能性がありるので、なんだかなー。です。

使っているテンプレートファイル名からページを取得する方法

1. get_pages() で取得する方法

<?php
$pages = get_pages([
  'meta_key'   => '_wp_page_template',
  'meta_value' => '[page-template-file].php',
]);

foreach($pages as $page){
  echo "{$page->ID}: {$page->post_title}<br>";
}
// 内部的に get_posts を呼んでいるようなのでメインクエリをリセット
wp_reset_postdata();

2. WP_Query() で取得する方法

<?php
$query = new WP_Query([
  'post_type'  => 'page',
  'meta_key'   => '_wp_page_template',
  'meta_value' => '[page-template-file].php',
]);

if( $query->have_posts() ) {
  while ( $query->have_posts() ) {
    $query->the_post();
    $pageID = get_the_ID();
    $pageTitle = get_the_title();
    echo "{$pageID}: {$pageTitle}<br>";
  }
}
// メインクエリをリセット
wp_reset_postdata();

まぁ固定ページのテンプレート外でページのデータを使いたいなんて結構特殊ケースだと思いますが、 例えば特定のページテンプレートにカスタムフィールドなどを付けていて、固定ページのテンプレート外でこの値を取得したような場合はこの方法でページテンプレートのファイル名からページを取得することできました。
※ ページテンプレートが複数のページで使われている場合、該当する全てのページが取得されます
 

いつも書いてるケド、久々のWordPress!!
いわゆる受注のWEBサイト制作ってまだまだWordPressで〜ってのが多いですね。積極的に受注案件をしてないので忘れた頃にやってきて毎回なにかしらハマってる気がする…


[参考]

WordPressのツボとコツがゼッタイにわかる本

WordPressのツボとコツがゼッタイにわかる本

Git Submoduleのディレクトリを変更したい

サブモジュールのディレクトリを変更するのにハマったのでメモ。

EX
環境: git version 2.12.2

サブモジュールの追加

$ git submodule add git@my_module.git

追加した my_modulevendor/my_module に移動させたい。

1. ディレクトリを変更する方法

  1. .gitmodules を開いて[submodule] と path= の2箇所のパスを変更
    [submodule “vendor/my_module”]
       path = vendor/my_module
       url = git@module.git
    
    $ git add .gitmodules
  2. サブモジュールを移動させる
    $ mk dir vendor
    $ mv -vi my_module vendor/my_module
    
  3. 旧サブモジュールのGit管理対象から除外する
    $ git rm –cached my_module
  4. .git/modules にあるサブモジュールを変更するパスと同じ状態に変更する
    1. vendorディレクトリを作成し、my_modulevendor内に移動させる
    2. .git/modules/vendor/my_module/config を編集
      worktree= に続く相対パスを移動させたサブモジュールになうるように変更 (ディレクトリを変更したら../の数に気をつける)
      worktree = ../../../../vendor/my_module
  5. サブモジュールの指定されているパスを変更
    vendor/my_module/.gitをエディタで開きgitdir:に続く相対パス4.で移動させたmy_moduleになるように変更する (ディレクトリを変更したら../の数に気をつける)
    gitdir: ../../.git/modules/vendor/my_module
  6. .git/configに記述されているサブモジュールのパスを変更する
    [submodule “vendor/my_module”]
     url = git@github.com:chaika-design/my_module.git
    
  7. 新しいサブモジュールのディレクトリをgit管理下に追加
    $ git add vendor
  8. 変更状態を確認
    $ git status
    On branch master
    Changes to be committed:
     (use “git reset HEAD …” to unstage)
    modified: .gitmodules renamed: my_module -> vendor/my_module
    サブモジュールがrenamedになっていればOK
    .git/modules/vendor/my_module/configvendor/my_module/.gitのパスを間違えているとgit statusした時にfatal: Could not chdirというエラーが出るのでその場合はパスを見直す
  9. 問題がなければ変更をコミット
    $ git commit
    $ git submodule status
    b5852af17275cXXXXX vendor/my_module (heads/master)
    
    わーい。できた〜!

2. サブモジュールを一度削除して再登録する方法

  1. サブモジュールの登録を解除
    $ git submodule deinit my_module
    .git/configからsubmoduleの設定が消える
  2. サブモジュールの削除
    $ git rm my_module
    .gitmodulesに記入されたsubmoduleの指定とサブモジュールのディレクトリが消える
  3. $ git commitでサブモジュールの削除をコミット
  4. 再度変更したいディレクトリを指定してサブモジュールを追加
    $ git submodule add git@my_module.git vendor/my_module

 
Git Submodule クセが強すぎて辛い。不用意にgit resetとかするとハマりまくる… ディレクトリの変更がうまくいかない場合は、サブモジュールを削除したコミットログが残ってしまいますが一度git submodule deinitでサブモジュールを削除して、再度変更するディレクトリにgit submodule add する方が楽かもしれないと思いました。(ディレクトリ変更の方法だと手順も多いし… )

 
記事内容とは関係ないけれど、
はてなブログのマークダウンでリスト内にコードブロックを書く方法が知りたい…
直接HTML書いてるんだけど……. つらい


[参考]