制作の現場から  
  ワードプレス 投稿スラッグをカスタムフィールドの値で置き換える方法
2019
29
Jun

ワードプレス 投稿スラッグをカスタムフィールドの値で置き換える方法

何に使うのか分かりませんがクライアントからカスタムフィールドの値で投稿スラッグを変更してほしいとの依頼を受けました。応用ができると思いますのでその時のメモです。

投稿スラッグはデータベースの中のテーブル posts に post_name というカラム名で保存されています。これを書き換えてあげればよいのですが、フィルターが用意されていましたのでこれを使います。

フィルターの名前は wp_unique_post_slug です。

このフィルターは記事が保存される前に呼び出されますので、カスタムフィールドの値を get_post_meta() などで取得することはできません。

ですので $_POST[‘カスタムフィールドの名前’] の値を参照します。

functions.php


function arumakan_slug( $slug, $post_ID, $post_status, $post_type ) {

	if( isset( $_POST['カスタムフィールドの名前'] ) ) {
		$tn_meta = $_POST['カスタムフィールドの名前'];
		if ( $tn_meta ) {
			$slug = utf8_uri_encode( $tn_meta );
		}
	}

	return $slug;

}

add_filter( 'wp_unique_post_slug', 'arumakan_slug', 10, 4 );

通常ならこれでOKなのですが、クライアントはアドバンスドカスタムフィールドプラグイン「Advanced Custom Fields」を使っていました。

「Advanced Custom Fields」で作成したカスタムフィールドはデータベースに保存される前は $_POST[‘fields’][‘フィールドキー’] という連想配列の中に格納されています。

ですので $_POST[‘fields’][‘フィールドキー’] を取得するために $_POST[‘fields’] を var_dump します。そうして調べた [‘fields’][‘フィールドキー’] を使って上記のコードを書き換えます。

functions.php


function arumakan_slug( $slug, $post_ID, $post_status, $post_type ) {

	if( isset( $_POST['fields']['フィールドキー'] ) ) {
		$tn_meta = $_POST['fields']['フィールドキー'];
		if ( $tn_meta ) {
			$slug = utf8_uri_encode( $tn_meta );
		}
	}

	return $slug;

}

add_filter( 'wp_unique_post_slug', 'arumakan_slug', 10, 4 );

[‘fields’][‘フィールドキー’] を調べる方法は functions.php で使用する変数の値を調べる方法として別の機会に紹介したいと思います。

プラグインに関係なく実現できるコードは以下に書いておきます。

functions.php


function arumakan_slug( $post_ID, $post ) {
	global $wpdb;
	$slug = get_post_meta( $post_ID, 'カスタムフィールドの名前', true );
	if( $slug ){
		$wpdb->update(
			$wpdb->posts,
			array( 'post_name' => $slug ),
			array( 'ID' => $post_ID ),
			'%s',
			'%d'
		);
	}
}
add_action( 'save_post', 'arumakan_slug', 10, 2 );

これは一旦データベースへ保存されたものを呼び出した後、それを書き換えるコードです。

目視ではスピードに違いは感じられませんが、保存したものを呼び出し書き直して再度保存するのですから無駄な動きが多いですね。

できれば [‘fields’][‘フィールドキー’] の値を調べて使う方法がお勧めです。

ベストはカスタムフィールドのプラグインを使わないで自作する方法だと思います。

参考までに:プラグインなしで投稿ページにカスタムフィールドを複数作成する

 

top