2016-12-12 3 views
0

投稿が編集されたときに返されるように、投稿が完全に編集されたとき、追加されなかったりゴミ箱になっていないときだけの状態

私はいくつかの条件を追加しましたが、私は投稿を作成または削除してもなお続きます。

add_action('post_updated', 'my_product_edited'); 

function my_product_edited($post_id, $post_after, $post_before) { 

    // Check to see if we are autosaving 
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) 
     return; 

    // assure the post type 
    if (! get_post_type($post_id) == 'product') 
     return; 

    if (wp_is_post_revision($post_id)) 
     return; 

} 

答えて

2

あなたはポストがに編集されている場合にのみ作業を行うためにアクセスを取得する方法を知りたいです。

post_updatedイベントに登録されたコールバックを使用します。しかし、これが「編集」アクションであるかどうかをチェックする関数を構築する必要があります。

「編集」のみのアクションを決定するものは何ですか?

あなたはアクション値としてeditpostは編集アクションであると思います。実際には、このアクションは、編集と同様に新しい投稿を追加するときに設定されます。どうして?

WordPressは次のレコードを取得し、[新規追加]をクリックすると投稿IDを割り当てます。アクションの非表示入力は、フォームのHTML内でeditpostに設定されています。

したがって、新しい投稿と編集する投稿の両方はの値を$_POST['action']に使用します。

新しい投稿投稿と編集済み投稿投稿を区別するために使用できるキーと値を把握する必要があります。

さんは "新しいポストを追加" フォームのHTMLを見てみましょう新しいポストHTML

を追加します。

Add New Post form HTML

隠しフィールドを見てみましょう:

<input id="hiddenaction" name="action" value="editpost" type="hidden"> 

どのように "新しい投稿"の隠しフィールド "アクション"が "editpost"の値に設定されているかを参照してください。

編集後のHTML

次は、編集後のインタフェースのためのHTMLを見てみましょう:それはまた、「アクション」の隠しフィールドに同じ値を使用していることがわかり、

Edit Post form HTML

オーケー。

<input id="hiddenaction" name="action" value="editpost" type="hidden"> 

どのフィールドを使用できますか?

上記のHTMLフィールドを比較すると、[新しい投稿の追加]フォームと[投稿の編集]フォームの間で、_wp_http_refererの値が異なることがわかります。ああ、我々はアクションフィールドと組み合わせてそのフィールドを使うことができます。編集後の提出

は、今度はそれを一緒に入れて、この提出は、「編集」だけのためであるかどうかを確認する機能を構築してみましょうかどうかをチェックする

機能。

/** 
* Checks if the post's submission is an "edit" 
* 
* @since 1.0.0 
* 
* @param int $post_id 
* 
* @return bool 
*/ 
function is_post_submission_an_edit_task($post_id) { 
    if (! isset($_POST['action'])) { 
     return false; 
    } 

    if ('editpost' != $_POST['action']) { 
     return false; 
    } 

    if (! isset($_POST['_wp_http_referer'])) { 
     return false; 
    } 

    $referer = '/wp-admin/post.php?post=' . $post_id . '&action=edit&message='; 

    return $referer === substr($_POST['_wp_http_referer'], 0, strlen($referer)); 
} 

ラインの最後のカップルはリファラではなくmessage=値を調べます。どうして?そのメッセージ値が変更される可能性があるためです。したがって、その値をクリップし、残りの文字列を調べます。機能

次を使用して

、あなたは'post_updated'というイベントにコールバックを登録します。このコールバックでは、3つのパラメータを渡すことができます。あなたはそれらの少なくとも2つが欲しい。すなわち、私はあなたが欲しいの引数、例えば10
  • 数に設定し、

    • 優先順位番号を:したがって、次のように指定する必要があります私はここ3

    に設定コードは次のとおりです。

    add_action('post_updated', 'process_after_product_edited', 10, 3); 
    /** 
    * Process work when the product has been edited. 
    * 
    * @since 1.0.0 
    * 
    * @param int  $post_id  Post ID. 
    * @param WP_Post $post_after Post object following the update. 
    * @param WP_Post $post_before Post object before the update. 
    */ 
    function process_after_product_edited($post_id, $post_after, $post_before) { 
    
        if (! is_post_being_updated($post_id)) { 
         return; 
        } 
    
        if ($post_after->post_type != 'product') { 
         return; 
        } 
    
        // now you can do your work 
    
    } 
    

    これは、「編集」提出の場合は最初のチェックを確認します。いいえ、私たちは何もすることができないので救済する。

    2番目のチェックでは、特定のユースケースごとに投稿タイプが製品であるかどうかが判断されます。もしそうでなければ、何もすることができないので救済しなさい。

    それ以外の場合は、コードを「はい、この製品を編集しました」の下に置くことができます。

  • +0

    ありがとうございます。しかし、そこに製品を追加すると、私は機能の通知を受け取ります。 – ctovelox

    +0

    @ctoveloxどういう意味ですか? 「機能の通知を受ける」とは何を意味するのかを明確にしてください。 – hellofromTonya

    +0

    申し訳ありませんが、私は明確にするために、私はこの機能を使用して、製品が編集されたときに私に電子メールを送信しています。しかし、私は製品を作成するときにも私は電子メールを受信して​​います。 – ctovelox

    1

    投稿タイプの確認後に次のチェックを追加できます。

    if (!isset($_POST['action']) || $_POST['action'] != 'editpost') 
    { 
        return; 
    } 
    
    関連する問題