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

# はじめに

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


# WP_Query

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

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

下記、条件を探す。

- `_field_A` : 投稿にカスタムフィールド項目あり
- `_field_B` : 投稿にカスタムフィールド項目あり
- `_field_C` : 投稿にカスタムフィールド項目なし

```php: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。つけた名前を使って、並び替え条件を書いてあげましょう。

```php: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 );
```

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

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

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

```php: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 ) {
		//処理
	}
```

　<font color="red">【要確認】</font> カスタムステータスはカスタム投稿タイプと紐付けされていないため「自分専用のカスタム投稿タイプの専用のカスタムステータス」というのは作れないようです。また、カスタムステータスはデーターベース上に値を保持していない（＝毎回`register_post_status()`で定義されたものを使う）ようで、カスタムステータスを削除する方法は無いようです。(削除＝必要のないもの＝最初から定義しなければいい の考え方)

# 管理画面

## add_settings_field()

　管理画面で独自の設定項目を作るときに使うのですが、実は配列で引数を渡せます。第6パラメータに配列を指定するとコールバックに指定したメソッドなどに、パラメータとして渡せます。

```php: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.](https://wordpress.org/plugins/if-link-is-404broken-then-set-to-private/)

　宣伝です。今回、開発したプラグインです。記事ごとに指定できるURLを、定期的にクロールします。指定URLがエラー(404, 503など)だったとき、その記事を非公開にします。

　[github](https://github.com/yyano/wp-if-link-404)でプラグインのソースコード公開していますので、ここの記述どうしてるんだろう？ここ手抜きしてバグってる！とか ありましたらお知らせ下さい。