というカスタムファイルがありxxxx_url
ます。xxxx_url
一意である必要があります。
それで、投稿を公開する前に、それxxxx_url
が一意であるかどうかを確認したいと思いますか?一意でない場合は、投稿の公開を拒否する必要があります。
試しましたpublish_post
。しかし、それは私たちが投稿を公開するときにトリガーされるので、それは正しいものではありません。公開の直前にコードを実行したい。
というカスタムファイルがありxxxx_url
ます。xxxx_url
一意である必要があります。
それで、投稿を公開する前に、それxxxx_url
が一意であるかどうかを確認したいと思いますか?一意でない場合は、投稿の公開を拒否する必要があります。
試しましたpublish_post
。しかし、それは私たちが投稿を公開するときにトリガーされるので、それは正しいものではありません。公開の直前にコードを実行したい。
回答:
の最初にwp_insert_post
、投稿を保存/更新する関数として、というフィルターがありますwp_insert_post_empty_content
。デフォルトでは、このフィルターは、タイトル、エディター、および抜粋フィールドがすべて空であるかどうかをチェックします。この場合、保存プロセスは停止します。
ただし、保存するすべてのフィールドがこのフィルターに渡されるため、このフィルターを拡張して、投稿を空と見なすかどうかを決定する他のテストを含めることができます。これは次のようなものです。
add_filter ('wp_insert_post_empty_content','wpse312975_check_unique_url',10,2);
function wpse312975_check_unique_url ($maybe_empty, $postarr) {
// extract custom field from $postarr, check uniqueness
if ($unique) return false else return true;
}
注:保存プロセスを停止するには、関数が「true」を返す必要があります。
カスタムフィールドが一意でない場合は、警告をエコーすることもできます。
wp_insert_post_empty_content
意味的に空のコンテンツを意図しているため、後で投稿しないことにしました。とは言っても、意味的にこれに適したフックは見つかりませんでした。
wp_insert_post_valid_content
を表すためにフィルターに名前を付ける必要がありますが、それ以外の場合は正確に正しい場所にあります。
wp_insert_post_empty_content
フィルターを見つけたの?
AJAXを使用して、投稿を投稿する前に一意性をチェックしてみませんか?
$( '#post' ).on( 'submit', function( event ) {
event.preventDefault(); // Prevent publishing
//Now do some AJAX Checks
$.post( ajaxurl, data, function(response) {
if ( response === 'success' ) {
$( this ).off( event ).submit();
} else {
alert( 'The custom field must be unique' );
}
});
});
コードはテストされていませんが、動作するはずです。希望する結果を得るには、それを試してみる必要があるかもしれません。
私はwp_insert_post_dataフィルターにフックし、これをできるだけ邪魔にならないよう処理します。私が理解しているように、投稿の挿入をブロックしたくないので、メタ値が重複する投稿を公開しないようにしたいだけです。
コードを共有しなかったので、この場合は多くのことを惜しむことはできませんが、機能するフィルターの擬似コードを次に示します。
function wp8193131_check_if_meta_value_is_unique ( $data, $postarr ) {
// setup an uniqueness flag.
$meta_is_unique = true;
// check if the meta is unique and modify the `$meta_is_unique` flag accordingly.
// {...} <- your code
// if the meta is NOT unique keep the post status in draft.
if ( ! $meta_is_unique ) {
// you can force the current post to be draft until the meta value will became unique.
$data['post_status'] = 'draft';
// maybe, update the meta value with a hint of the fact that it's not unique.
// or display a dashboard notice about it.
}
return $data;
}
add_filter( 'wp_insert_post_data', 'wp8193131_check_if_meta_value_is_unique' );
このフィルターのもう1つの優れた点は、添付ファイルから分離されていることwp_insert_attachment_data
です。
私はそれが役に立てば幸いです、そしてあなたが何をしても、それは素晴らしい音です!
$data['post_status']
ありpublish
、ユーザーがそれを更新している場合はどうなりますか?投稿を問題としてdraft
作成しないの404
ですか?
チェックはに行ってくださいwp_insert_post
。このフックは、投稿が公開または編集されるたびに発生します。
そこで、カスタムクエリを実行して、同じxxxx_url
値を持つ投稿があるかどうかを確認できます。
add_action('wp_insert_post', function($post_id) {
$meta_key = 'xxxx_url';
$meta_value = get_post_meta($post_id, $meta_key, true);
$query = new WP_Query([
'post_type' => get_post_type($post_id), // This might be unnecessary, if you check `post` post type only. Or use `any`.
'meta_query' => [
[
'meta_key' => $meta_key,
'meta_value' => $meta_value,
]
]
]);
if ($query->have_posts()) {
// invalid key, post with the same value already exists
} else {
// valid, key was not found anywhere
}
});
wp_insert_post
ているように、投稿が保存されるとアクションが発生するので、if / elseステートメントの投稿内に書き込んだものはすべて公開されますが、投稿の公開または挿入をブロックすることはできません。
If it isn't unique it should reject publishing post.
私の質問でそれを明確に述べました。
132_url
どこ132
のポストIDです。あなたはいつもここでユニークな価値を持っています。さらに、カスタムフィールドはsave_post
アクションに保存する必要があります。このアクションでは、カスタムフィールドをチェックして(空ではなく、たとえば一意の値がある場合)、これに基づいているupdate_post_meta
かどうかを確認できます。カスタムフィールドを確認して、一意の値がない場合は、に設定post-status
するdraft
か、公開を無効にすることもできます。それ以外の場合、これを行うにはjQueryが必要だと思います。