2017-02-12 3 views
1

私はWPCasa Dashboard Pluginを使用して、ユーザーが不動産オブジェクトを送信できるようにしています。私は、オブジェクトを検証するために外部サービスを使用する必要があります。私はサービスからの応答がエラーを持っている場合、データベースを更新するWPをブロックしたいと思います。有効でない場合、WordPressの送信を停止します。 (WPCasa)

私は自分の機能にwpcasaの独自のフックを使用しています。


これは私の子供のテーマでfunctions.phpの一部です:

function newListingAdded($ID, $post) { 

    ... 

    if ($post->post_date === $post->post_modified) { 
    // new post 
    $response = wp_remote_post($targetUrl.'listings/new', $options); 
    } else { 
    $response = wp_remote_post($targetUrl.'listings/update', $options); 
    } 

    $output = json_decode($response['body']); 
    if (is_array($output)) { 
    $_SESSION['messages'] = []; 
    foreach ($output as $error) { 
     if (isset($error->msg)) { 
     array_push($_SESSION['messages'], ['danger', $error->msg]); 
     } 
    } 
    } 
} 
add_action('publish_listing', 'newListingAdded', 10, 2); 

これまでのところ、すべてが意図したように動作します。私はちょうど実際にデータを提出することからwordpressを停止する方法を理解できません。

答えて

0

WPCasaのアクション(WPCasaのドキュメントでは見つかりませんでした)をpublish_listingの代わりに使用する代わりに、WordPressの公式wp_insert_post_dataフィルタを使用することができます。あなたはWPがかかることがわかります:あなたはWPのソースコード(https://core.trac.wordpress.org/browser/tags/4.7/src/wp-includes/post.php#L3281参照)を見れば

さて、WPは正式に、しかし、アクション/フックを使用して保存されることから、ポストを防止するための方法をサポートしていません。 wp_insert_post_dataから返された$dataの値(データベースに保存されるフィールドと値のペアの連想配列)が$ wpdb-> update()に渡されます。

wp_insert_post_dataを使用して、実際の$dataパラメータをフィルタで受信する代わりに真偽値を返すと、$ wpdb-> update()は$ dataがaであるかどうかをチェックするので、投稿が更新されないようにします。有効な配列ではなく偽、それ以外の場合は、データベース上で何もしない(参照:https://core.trac.wordpress.org/browser/tags/4.7/src/wp-includes/wp-db.php#L2023

だから、あなたはこのコードを使用して試すことができます:

function newListingAdded($data, $postarr) { 
    if (!$data['ID']) { // If no post ID is set then it's a new post 
    $response = wp_remote_post($targetUrl.'listings/new', $options); 
    } else { 
    $response = wp_remote_post($targetUrl.'listings/update', $options); 
    } 

    $output = json_decode($response['body']); 

    if (is_array($output)) { 
    $_SESSION['messages'] = []; 

    foreach ($output as $error) { 
     if (isset($error->msg)) { 
     $_SESSION['messages'][] = ['danger', $error->msg]; // You can use the [] shorthand operator instead of the more verbose array_push() 
     $data = false; // If an error is found make $data false 
     } 
    } 
    } 

    return $data; 
} 

add_filter('wp_insert_post_data', 'newListingAdded', 10, 2); 

ここでこのフィルタの参照です: https://developer.wordpress.org/reference/hooks/wp_insert_post_data/

関連する問題