公式見てて、ずっと欲しいなー欲しいなーと思いつつ、ただ買わなくても実現できる案件しかなかったので我慢してたけど、ついに Advanced Custom Fields PRO が必要な案件が来た!
ということで速攻買いました。(会社の経費で)
早速あれやこれや使ってみて
まずはこれでしょう、ということでオプションページを作ってみました。
正直公式ドキュメント見れば一発なんだけど、うちの社員には英語の読めないバカが多いので、かいつまんでご説明。
一番シンプルな書き方
1 2 3 4 5 |
<?php if( function_exists('acf_add_options_page') ) { acf_add_options_page(); } ?> |
もうこれでページが作られます。
ただこれじゃ有料プラグインを買った意味がないじゃないですか。自分で作ろうと思えば作れるし。
高度というほどでもない書き方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php if( function_exists('acf_add_options_page') ) { acf_add_options_page(array( 'page_title' => 'Theme General Settings', 'menu_title' => 'Theme Settings', 'menu_slug' => 'theme-general-settings', 'capability' => 'edit_posts', 'redirect' => false )); acf_add_options_sub_page(array( 'page_title' => 'Theme Header Settings', 'menu_title' => 'Header', 'parent_slug' => 'theme-general-settings', )); acf_add_options_sub_page(array( 'page_title' => 'Theme Footer Settings', 'menu_title' => 'Footer', 'parent_slug' => 'theme-general-settings', )); } ?> |
公式ドキュメントのそのままです。
acf_add_options_page()
…オプションページを作るやつ。
acf_add_options_sub_page()
…サブ(子)ページを作るやつ。parent_slugに親のmenu_slugを指定してやれば子供になります。簡単!
それぞれ渡せるパラメータを、翻訳というか勝手な解釈で日本語説明にしてみます。
※正直まだあんまり検証してないので間違ってる可能性がすごくある。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<?php $args = array( /* (string) The title displayed on the options page. Required. */ /* (string) オプションページで表示されるページのタイトル。必須。 */ 'page_title' => 'Options', /* (string) The title displayed in the wp-admin sidebar. Defaults to page_title */ /* (string) 管理画面サイドバーに表示されるタイトル。デフォルトは「page_title」と同じもの */ 'menu_title' => '', /* (string) The slug name to refer to this menu by (should be unique for this menu). Defaults to a url friendly version of menu_slug */ /* (string) このメニューを参照するためのスラッグ(ユニークである必要があります)。 デフォルトでは、menu_slug(たぶんmenu_titleの間違い)をURLに適した形にしたもの */ 'menu_slug' => '', /* (string) The capability required for this menu to be displayed to the user. Defaults to edit_posts. Read more about capability here: http://codex.wordpress.org/Roles_and_Capabilities */ /* (string) このメニューが表示されるユーザーの権限。デフォルトはedit_posts。 */ 'capability' => 'edit_posts', /* (int|string) The position in the menu order this menu should appear. WARNING: if two menu items use the same position attribute, one of the items may be overwritten so that only one item displays! Risk of conflict can be reduced by using decimal instead of integer values, e.g. '63.3' instead of 63 (must use quotes). Defaults to bottom of utility menu items */ /* (int|string) メニューが表示される位置。 同じ数値で指定すると、1つだけを表示するために、もう1つは上書きされる可能性がある。 整数じゃなく小数点で書けば、ぶつかる可能性を減らすことができるよ。「63」じゃなく「63.3」とか。ただ小数点の場合は必ずクォーテーションで囲む。 デフォルトはユーティリティメニュー?の下。 */ 'position' => false, /* (string) The slug of another WP admin page. if set, this will become a child page. */ /* (string) サブ(子)ページとして表示するときに、親のメニュースラッグを指定する。それが存在してればその子ページになる。 */ 'parent_slug' => '', /* (string) The icon class for this menu. Defaults to default WordPress gear. Read more about dashicons here: https://developer.wordpress.org/resource/dashicons/ */ /* (string) メニューの表示アイコンのクラス。 */ 'icon_url' => false, /* (boolean) If set to true, this options page will redirect to the first child page (if a child page exists). If set to false, this parent page will appear alongside any child pages. Defaults to true */ /* (boolean) trueにすると、このオプションページの最初の子ページにリダイレクト。つまり、メニュー名としてだけ使うときにtrueにする。 ただし子ページがいないと無効。falseにした場合は、この親ページ自体もページとして存在できる感じ。デフォルトはtrue */ 'redirect' => true, /* (int|string) The '$post_id' to save/load data to/from. Can be set to a numeric post ID (123), or a string ('user_2'). Defaults to 'options'. Added in v5.2.7 */ /* (int|string) これは後述する取得、表示の箇所で説明しよう。とりあえずデフォルトは「options」です。 */ 'post_id' => 'options', /* (boolean) Whether to load the option (values saved from this options page) when WordPress starts up. Defaults to false. Added in v5.2.8. */ /* (boolean) これ正直よく分からんけど、WordPressの起動時にロードするかどうかって言ってるから、 the_fieldした時に初めてDB参照するんじゃなくて、ページに来た時点で取得しておくかどうかってことじゃないかな。 全ページで使うようなものはそれでOK。特定のページでしか使わないものは、falseで。デフォルトはfalse。 */ 'autoload' => false, ); ?> |
あとは表示する時。
普通に投稿のカスタムフィールドと同じように、the_field()でOK。
ただし、別の投稿から取得するときみたいに第二引数を指定する必要がある。
ここで使うのが、上記のパラメータの「’post_id’ => ‘options’」の値。
1 |
<?php the_field('field_name', 'option'); ?> |
なんか「option」でも「options」でもいいみたい。
今度プラグインのファイルの中身見てみようかと思う。
ただこれだと、
オプションページを複数作ったときに、同じフィールド名で別物としては扱えない。
同じフィールド名を複数のオプションページに設定してみたら、まったく同じもの表示されてました。
この辺は色々とバリエーションありそうだけど検証する時間があんまりなかったので、試しに
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php if( function_exists('acf_add_options_page') ) { acf_add_options_page(array( 'page_title' => '親ページ', 'menu_title' => '親メニュー', 'menu_slug' => 'parent-menu', )); acf_add_options_sub_page(array( 'page_title' => '子ページ1', 'menu_title' => '子メニュー1', 'parent_slug' => 'parent-menu', 'post_id' => 'child1', )); acf_add_options_sub_page(array( 'page_title' => '子ページ2', 'menu_title' => '子メニュー2', 'parent_slug' => 'parent-menu', 'post_id' => 'child2', )); } ?> |
これで設定してみたら、同じフィールド名を設定してみても、
1 2 |
<?php the_field('field_name', 'child1'); ?> <?php the_field('field_name', 'child2'); ?> |
これで別々で取得できました。
とりあえず今日のところはここまで!