はじめに
WordPressのプラグイン開発をするときに、いくつかハマったり、こんなコードの書き方できるんだ!というのがあったのでご紹介。
WP_Query
カスタムフィールドが設定されている投稿を探す
カスタムフィールドの_field_A
, _field_B
, _field_C
が設定されたりされてなかったり。そんな投稿を探すWP_Query。_field_A = "AAAA"
なカスタムフィールドを値で探す場合のサンプルはたくさん見つかるけど、検索時に値はどうでもよくてカスタムフィールドがあればいい/フィールドがないければいい場合のサンプルがなかったので、メモ残しておきます。
下記、条件を探す。
-
_field_A
: 投稿にカスタムフィールド項目あり -
_field_B
: 投稿にカスタムフィールド項目あり -
_field_C
: 投稿にカスタムフィールド項目なし
$args = array(
'meta_query' => array(
'relation' => 'AND',
'A_clause' => array(
'key' => '_field_A',
'compare' => 'EXISTS',
),
'B_clause' => array(
'key' => '_field_B',
'compare' => 'EXISTS',
),
'C_clause' => array(
'key' => '_field_C',
'compare' => 'NOT EXISTS',
),
),
);
$the_query = new WP_Query( $args );
カスタムフィールドの値でソート
でも、カスタムフィールドの値でソートした投稿の並びで欲しくなることもあります。そんなときは、カスタムフィールドの検索条件に名前をつけてあげればOK。つけた名前を使って、並び替え条件を書いてあげましょう。
$args = array(
'meta_query' => array(
'relation' => 'AND',
'A_clause' => array(
'key' => '_field_A',
'compare' => 'EXISTS',
),
'B_clause' => array(
'key' => '_field_B',
'compare' => 'EXISTS',
),
'C_clause' => array(
'key' => '_field_C',
'compare' => 'NOT EXISTS',
),
),
'orderby' => array(
'B_clause' => 'ASC',
),
);
$the_query = new WP_Query( $args );
カスタム投稿タイプ・カスタムステータス
公開されているカスタム投稿タイプのみ取得する
// get public post-type
$args = array(
'public' => true,
);
$post_types = get_post_types( $args, 'names' );
カスタムステータス関連
get_post_stati()
という見慣れない関数を使います。ここで使用する$args_statuses
オプション指定はregister_post_status()
で指定する引数と同じように指定して、該当するカスタムステータスを取得することができます。
取得したカスタムステータスは、第2パラメータでobjects
の指定すると配列で値が返ってくるので、不要なカスタムステータスを取得結果から削ることができます。
// get post statuses
$args_statuses = array(
'public' => false, // 非公開状態となるもの
'internal'=> false // WP内部利用でないもの
);
$post_statuses = get_post_stati( $args_statuses, 'objects' );
unset( $post_statuses['future'] ); // 予約投稿を除外
foreach( $post_statuses as $post_status_key => $post_status_value ) {
//処理
}
【要確認】 カスタムステータスはカスタム投稿タイプと紐付けされていないため「自分専用のカスタム投稿タイプの専用のカスタムステータス」というのは作れないようです。また、カスタムステータスはデーターベース上に値を保持していない(=毎回register_post_status()
で定義されたものを使う)ようで、カスタムステータスを削除する方法は無いようです。(削除=必要のないもの=最初から定義しなければいい の考え方)
管理画面
add_settings_field()
管理画面で独自の設定項目を作るときに使うのですが、実は配列で引数を渡せます。第6パラメータに配列を指定するとコールバックに指定したメソッドなどに、パラメータとして渡せます。
foreach( $post_types as $post_type ) {
add_settings_field(
sprintf('iflink404-post_type-%s', $post_type->name ),
$post_type->labels->name,
array( $this, 'print_post_type' ),
'iflink404-settings-page',
'iflink404_then_set',
array( 'name' => $post_type->name )
);
}
public function print_post_type( $args ) {
// 処理
}
さいごに
if link is 404(broken), then set to private.
宣伝です。今回、開発したプラグインです。記事ごとに指定できるURLを、定期的にクロールします。指定URLがエラー(404, 503など)だったとき、その記事を非公開にします。
githubでプラグインのソースコード公開していますので、ここの記述どうしてるんだろう?ここ手抜きしてバグってる!とか ありましたらお知らせ下さい。