web-dev-qa-db-ja.com

投稿を公開する前にカスタムフィールドを検証するためのアクションフィルタ/フックはありますか?

私は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'を返さなければなりません。

カスタムフィールドが一意でない場合は、警告を表示することもできます。

5
cjbj

投稿を投稿用に送信する前に、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' );
    }
  });
});  

コードはテストされていませんが、動作するはずです。あなたはあなたの望ましい結果を得るためにそれと遊ぶ必要があるかもしれません。

1
Abhik

私は wp_insert_post_data filterにフックして、できるだけ邪魔にならないようにこれを処理します。なぜなら、あなたが投稿の挿入をブロックしたくないのであれば、メタ値が重複する投稿の公開を避けたいからです。

あなたがコードを共有していないので、私はこの場合あまりにも惜しむことはできませんが、これはうまくいくフィルタのいくつかの擬似コードです:

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' );

このフィルタのもう一つの素晴らしいところは、添付ファイルから分離されていることですwp_insert_attachment_data

それが役立つことを願っています、そしてあなたが何をしても、それは素晴らしいですね!

0
Andrei