「Wordpress」タグアーカイブ
ACFの入力欄が全てに表示されてしまう。
プラグイン内で add_action(‘init’ … ) にフックすると function.php に記述したのと同等になるので、
Advanced Custom Fields でエクスポートした php コードを追記したところ
管理画面の全ての入力画面に、追加したカスタムフィールドの入力欄が表示されるようになってしまった。
しかも、ローディングアイコンのまま、入力欄は表示されない。
原因は
1 2 3 4 5 6 7 |
if(function_exists("register_field_group")) { register_field_group(array ( 'id' => 'acf_%e5%95%86%e5%93%81', 'title' => 'タイトル', 'fields' => array ( : |
と、ID が化けていたため。ここを
1 |
'id' => 'acf_additional-custom-fields', |
の様に書き換えてやれば正しく表示されるようになった。
そんなのわからんわ(笑)
カスタムフィールドの使い方
WordPress はカスタムフィールドという便利な機能があるが、ちょっと触らないとすぐ忘れてしまうので備忘録的にまとめておく。
Custom Post Type UI
カスタムポストタイプを追加できるプラグイン。例えば「商品」のようなものを投稿と同列に作ることができる。
[CPT UI] > [Add/Edit Post Types] > [Add New Post Type] で追加 / [Edit Post Types] で編集。
「商品」というカスタムポストタイプを作る場合は
Post Type Slug:product
Plural Label:商品
Singular Label:商品
の様に指定する。後はほぼデフォルトでOK。
※ 何故Plural Label とSimgular Label があるかというと英語は複数形があるため。日本語では関係ない。
Supports にチェックしたものが新規追加/編集欄で表示される。
何も表示しない場合は明示的に None をチェック。
アイコンを替えたい場合は Menu Icon に ダッシュアイコンクラス名 を指定する。
例えばカートアイコンを指定するなら Menu Icon
特にカテゴリーやタグを追加したい場合は Bult-in Taxonomies にチェックする。
Advanced Custom Fields
カスタムフィールドを追加するプラグイン。
[カスタムフィールド] > [新規追加] で新規追加 / [編集] で編集。
先ほど作った「商品」に「在庫数」というフィールドを追加する場合は
Show this field group ifを指定する。
[+フィールドを追加] で在庫フィールドを追加する。名前は number とか。
ユーザ一覧から選択させたい場合は、フィールドタイプ:ユーザー を指定する。
例えば上で作った商品を別のカスタムポストタイプから選択させたい場合は
フィールドタイプ:投稿オブジェクト / 投稿タイプ:product を指定する。
Admin Columns
投稿一覧画面のカラムを編集するプラグイン。
[設定] > [Admin Columns] でカスタム投稿タイプを選択して使う。
例えば商品名を表示する場合は
タイプ:カスタムフィールド
ラベル:商品
カスタムフィールド:product
フィールドタイプ:タイトル(Post ID’s)
の様に指定する。
ユーザの場合はフィールドタイプ:ユーザ名(User ID’s)になる。
カスタムポストタイプ、カスタムフィールドの使い方
こんな感じ
1 2 3 4 5 6 7 8 9 10 |
query_posts('post_type=product'); // カスタムポストタイプに product を指定 if (have_posts()): while(have_posts()): the_post(); the_title(); // 商品名 // echo get_the_title(get_the_ID()); // あるいはこっちの書き方でもOK echo ' ' . get_post_meta(get_the_ID(), 'number', true) // 追加した在庫のフィールド値を取得 . "個\n"; endwhile; endif; |
カスタムポスト・フィールドは遅いと聞くけれど、確かにこのやり方だとクエリーが大量に発生するので
遅くなるだろうなあ。手っ取り早いは手っ取り早いんだけれどなあ。
remove_filter
ヘッダーも何もない素のテキストを html 出力したいと思ってテンプレートを作ったけれど
勝手に改行に <br /> タグが付いたり <p> タグが付いてしまう。
そこで remove_all_filters(‘the_content’); でフィルターを削除すると
今度は Exec-PHP プラグインが効かない。(フィルターで実装してたのね。)
解決策は以下、wpautop フィルタを削除する。
1 2 3 4 5 6 7 8 9 10 |
<?php /* Template Name: プレーン テンプレート */ while (have_posts()) : the_post(); remove_filter('the_content', 'wpautop'); the_content(); endwhile; ?> |
これで <br /> も <p> も付かなくなったけれど、<?php … ?> は使える。
備忘録としてメモして置こう。
WordPressのURLを相対パスにする
Raspberry Pi に WordPress を入れた時に困ること、
それは WordPress は中のリンクを「絶対パス」で表示してしまうこと。
IP アドレス固定の据え置き型なら、これでも何の問題もないのだが
ラズパイの様に、手軽に持ち運んで DHCP で、都度 IP が振られるような利用シーンだと
途端にスタイルシートやリンクなどが辿れなくなってしまう。
「絶対パス」を「相対パス」に置き換えるには以下の対応をする。
テーマの編集で functions.php を編集する。
ファイルの最後に以下のコードを追記する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// 絶対パス→相対パス変換 class relative_URI { function __construct() { add_action('get_header', array(&$this, 'get_header'), 1); add_action('wp_footer', array(&$this, 'wp_footer'), 99999); } function replace_relative_URI($content) { $home_url = trailingslashit(get_home_url('/')); $top_url = preg_replace('/^(https?:\/\/.+?)\/(.*)$/', '$1', $home_url); return str_replace($top_url, '', $content); } function get_header(){ ob_start(array(&$this, 'replace_relative_URI')); } function wp_footer(){ ob_end_flush(); } } new relative_URI(); |
これでかなり持ち運びしやすくなったぞ。
その後の顛末
管理画面が絶対パスのままだった orz。こっちも相対パスにするにはフックを以下の様に修正する。
1 2 3 4 5 |
function __construct() { add_action('init', array(&$this, 'get_header'), 1); add_action('wp_footer', array(&$this, 'wp_footer'), 99999); add_action('admin_footer', array(&$this, 'wp_footer'), 99999); } |
init はフロントエンドでも管理画面でも呼び出される。
wp_footer はフロントエンドでのみ呼び出される。
admin_footer は管理画面でのみ呼び出される。
その後は、まあ大体問題なく使えるけれど、余裕があるなら wp_options の siteurl と home も相対パスにしておく。
例) http://localhost/wp → /wp
参考:
http://evm-label.com/2015/04/wordpress_path01/
http://2inc.org/blog/2012/02/03/1198/
テンプレートを開いたときに読み込まれるフックと順番
これは良いかもしれない。WordPressのみまもりメール
みまもりメール Web アプリを構築するために作られた WordPress テーマ。
簡単な操作でメールを飛ばすだけのシンプルな機能を実装しているんだけれど
敢えてプラグインは使わずにテーマだけで実現しているという発想も素晴らしい。
機会があったら使ってみよう的な感じで備忘録として保存。
未来の投稿を予約投稿せずに公開する。
標準の WordPress では、未来日付で投稿すると、その投稿は予約になってしまい、その日時になるまで公開されない。
あるサイトで、未来の日付の投稿でも公開したいという事案が発生したので対応した。
対応方法は・・・
テーマの functions.php に以下のコードを追記する。
1 2 3 4 5 6 7 |
function forced_publish_future_post($data, $postarr) { if ($data['post_status'] == 'future' && $postarr['post_status'] == 'publish') { $data['post_status'] = 'publish'; } return $data; } add_filter('wp_insert_post_data', 'forced_publish_future_post', 10, 2); |
post_status が、予約は ‘future’、公開は ‘publish’ になる。
上のフィルターを追加すると、新規投稿時に、実行される forced_public_future_post で、ステータスが予約だったら公開に書き換える。
これで未来日付でも問題なく公開される。