LoginSignup
4
2

More than 5 years have passed since last update.

WordPressのプラグイン開発時のちょいネタコードを紹介。

Posted at

はじめに

WordPressのプラグイン開発をするときに、いくつかハマったり、こんなコードの書き方できるんだ!というのがあったのでご紹介。

WP_Query

カスタムフィールドが設定されている投稿を探す

 カスタムフィールドの_field_A, _field_B, _field_Cが設定されたりされてなかったり。そんな投稿を探すWP_Query。_field_A = "AAAA"なカスタムフィールドを値で探す場合のサンプルはたくさん見つかるけど、検索時に値はどうでもよくてカスタムフィールドがあればいい/フィールドがないければいい場合のサンプルがなかったので、メモ残しておきます。

下記、条件を探す。

  • _field_A : 投稿にカスタムフィールド項目あり
  • _field_B : 投稿にカスタムフィールド項目あり
  • _field_C : 投稿にカスタムフィールド項目なし
function.php
    $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。つけた名前を使って、並び替え条件を書いてあげましょう。

function.php
    $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 );

カスタム投稿タイプ・カスタムステータス

公開されているカスタム投稿タイプのみ取得する

function.php
    // 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の指定すると配列で値が返ってくるので、不要なカスタムステータスを取得結果から削ることができます。

function.php
    // 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パラメータに配列を指定するとコールバックに指定したメソッドなどに、パラメータとして渡せます。

function.php
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でプラグインのソースコード公開していますので、ここの記述どうしてるんだろう?ここ手抜きしてバグってる!とか ありましたらお知らせ下さい。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2