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


11

というカスタムファイルがありxxxx_urlます。xxxx_url一意である必要があります。

それで、投稿を公開する前に、それxxxx_urlが一意であるかどうかを確認したいと思いますか?一意でない場合は、投稿の公開を拒否する必要があります。

試しましたpublish_post。しかし、それは私たちが投稿を公開するときにトリガーされるので、それは正しいものではありません。公開の直前にコードを実行したい。


1
現在の投稿IDを一意の値として設定しないでください。同様に:132_urlどこ132のポストIDです。あなたはいつもここでユニークな価値を持っています。さらに、カスタムフィールドはsave_postアクションに保存する必要があります。このアクションでは、カスタムフィールドをチェックして(空ではなく、たとえば一意の値がある場合)、これに基づいているupdate_post_metaかどうかを確認できます。カスタムフィールドを確認して、一意の値がない場合は、に設定post-statusするdraftか、公開を無効にすることもできます。それ以外の場合、これを行うにはjQueryが必要だと思います。
LWS-Mo

回答:


5

の最初に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」を返す必要があります。

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


2
これはおそらく機能しますが、解決策というよりは、ハックに少し似ています。私もこれを検討しましたが、wp_insert_post_empty_content意味的に空のコンテンツを意図しているため、後で投稿しないことにしました。とは言っても、意味的にこれに適したフックは見つかりませんでした。
スコット

まあ、それが空のタイトルとコンテンツのためだけだったら、開発者のためのフィルターはないでしょう。
cjbj 2018

1
「空」という単語だけに重点を置かない場合、このフィルターは投稿が保存の最小要件を満たしているかどうかを確認することを目的としています。OPは最小要件を広げたいと考えています。おそらくそれwp_insert_post_valid_contentを表すためにフィルターに名前を付ける必要がありますが、それ以外の場合は正確に正しい場所にあります。
cjbj 2018

@cjbjこのような質問がある場合、どのようにして正しいフィルターを見つけますか?どうやってwp_insert_post_empty_contentフィルターを見つけたの?
私は最も愚かな人です

1
まあ、WPをしばらく使用していると、コードのどの部分が管理者のどの部分を生成するかがわかるでしょう。したがって、ファイルを調べて、使用可能なフィルターのソースコードを確認します。
cjbj 2018

1

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

コードはテストされていませんが、動作するはずです。希望する結果を得るには、それを試してみる必要があるかもしれません。


0

私は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です。

私はそれが役に立てば幸いです、そしてあなたが何をしても、それは素晴らしい音です!


2
それは良い考えではないかもしれません。$data['post_status']ありpublish、ユーザーがそれを更新している場合はどうなりますか?投稿を問題としてdraft作成しないの404ですか?
スコット

@Scott言い換えると、公開された投稿が保存時にメタ値が一意でないことを検出した場合、投稿の公開は拒否され、投稿はドラフトされる必要があります。繰り返しになりますが、メタ値がどれほど重要であるかはわかりませんが、並べ替えのデータタイプや重要なものである場合、投稿のステータスは下書きである必要があります(これは404の問題ではなく、投稿が公共の場から引退)
Andrei

-1

チェックはに行ってください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
    }
});

3
私が知っwp_insert_postているように、投稿が保存されるとアクションが発生するので、if / elseステートメントの投稿内に書き込んだものはすべて公開されますが、投稿の公開または挿入をブロックすることはできません。
私はほとんど愚かな人です

投稿が検証に失敗した場合、公開をブロックしますか?あなたはあなたの質問でそれを書いていない。
Petr Cibulka

私はIf it isn't unique it should reject publishing post.私の質問でそれを明確に述べました。
私はほとんど愚かな人です
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.