web-dev-qa-db-ja.com

現在のカスタムフィールド値を持つ投稿が既に存在する場合は、公開前に確認する

カスタム投稿タイプがあり、カスタムフィールドが3つしかありません。

$post_types = get_post_meta($post->ID,'post_types',true);
$post_taxonomies = get_post_meta($post->ID,'post_taxonomies',true);
$post_terms = get_post_meta($post->ID,'post_terms',true);

私はこの$ post_types値を持つ投稿が既に存在するかどうか、そして存在するかどうかを確認したい - >公開せずにメッセージを表示します。

このカスタムフィールド用のメタボックスを作成しました。これにはすでにsave_postアクションフック用の関数があります。

function sidebars_meta_save( $id )  {  
    if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;  

    if( !isset( $_POST['sidebars_nonce'] ) || !wp_verify_nonce( $_POST['sidebars_nonce'], 'save_sidebars_meta' ) ) return;  
    if( !current_user_can( 'edit_post' ) ) return;  

    $allowed = array(  
        'p' => array()  
    );      

    if(isset( $_POST['post_terms'] )){
                    //check_exist_term - simple boolean function which check if 
                    //a post with this term already exist
        if(!check_exist_term($_POST['post_terms'])){
            if( isset( $_POST['post_types'] ) ){  
                update_post_meta( $id, 'post_types', wp_kses( $_POST['post_types'], $allowed ) ); 
            }
            if( isset( $_POST['post_taxonomies'] ) ) { 
                update_post_meta( $id, 'post_taxonomies', wp_kses( $_POST['post_taxonomies'], $allowed ) );
            }
                update_post_meta( $id, 'post_terms', wp_kses( $_POST['post_terms'], $allowed ) );
            }
        }else{
                        //if I will use wp_delete_post here, the message will not show
            //wp_delete_post($id);
            //wp_redirect('post-new.php?post_type=sidebars');
            //exit;
        }
    }
}  
add_action( 'save_post', 'sidebars_meta_save' );  

私のリダイレクトロケーション機能:

function sidebars_redirect_location($location,$post_id){
if( isset( $_POST['post_types'] ) ){  
    if(check_exist_term($_POST['post_terms'])){
        $status = get_post_status( $post_id );
        $location = add_query_arg('message', 21, $location);
                    //if I will use wp_delete_post here, I will be not able 
                    //to return to post edit page, because page will be already deleted
    }
}
return $location;
}
add_filter('redirect_post_location','sidebars_redirect_location',10,2);

私の投稿更新メッセージ機能:

function sidebars_custom_messages($messages){
$messages['sidebars'][21] = 'Looks like you tried publishing a post with term which already exist!';
return $messages;
}    
 add_filter('post_updated_messages', 'sidebars_custom_messages');    

1)wp_delete_post()を使用すべき場所まず最初にこの投稿が既に存在するというメッセージを表示し、その後この投稿を削除してこのページに留まるにはどうすればいいですか? 2)黄色ではなく赤いメッセージを表示する方法

2
user13250

メタ値が存在するかどうかを確認する

get_posts() (または WP_Query オブジェクト)を使用して、保存する投稿メタに一致するすべての投稿をクエリできます。投稿のステータス(つまり、無視するステータス)を指定する必要があります。以下はntestedのコードです。

(完全を期すために、デフォルト値が与えられているため省略できる引数を残しました)。また、投稿が更新されている場合に備えて、現在の投稿も除外します。そうでない場合、その投稿が返され、そのメタデータを持つ投稿が既に存在すると考えられます。

//Collect the terms
//I'm assuming that each of the values are strings. 
$meta_terms = $_POST['post_terms'];
$meta_taxs = $_POST['post_taxonomies'];
$meta_types = $_POST['post_types'];

//Query post type 'products' to check for posts whose meta values match the POSTed ones
$args = array(
  'post__not_in'=> array($id),
  'post_type' => 'product',
  'post_status' => array('publish','pending','draft','future','private'),
  'meta_query' => array(
      'relation' => 'AND',
      array(
        'key' => 'post_terms',
        'value' => $meta_terms,
        'compare' => '='
      ),
      array(
        'key' => 'post_taxonomies',
        'value' => $meta_taxs,
        'compare' => '='
      ),
      array(
        'key' => 'post_types',
        'value' => $meta_types
        'compare' => '='
      )
  )
);
$existingMeta = get_posts( $args );

if(empty($existingMeta)){
    //Go ahead and save meta data
}else{
    //Revert post back to draft status as shown in linked answer below.
}

サイドリマークス

「post_terms」などは非常に一般的です。私は彼らにもっと説明的でユニークな名前を付けます-ポストメタテーブルのキーとして使用される場合はもっとイベントになります。また、競合を避けるために、一意の名前を持つ配列内のデータを送信することもできます。

<input type="text" name="myplugin[post_terms]" value=""/>

次に、データを$_POST['myplugin']['post_terms']ではなく$_POST['post_terms']として取得します。 $_POST['myplugin']内のデータが別のプラグインによって上書きされていることを合理的に確認できます。また、mustnonces を使用して、ソース/意図を検証する必要があります。

投稿が公開されないようにする

preventを投稿することはできません(jQueryを使用しない限り)。ただし、投稿が公開された直後に、canチェックを実行し、必要に応じてドラフトステータスに戻します。 この関連する質問の解決策を参照

カスタムメッセージの表示

リンクされたソリューションで、投稿が下書きに戻された場合、メッセージ変数を「10」に設定して、下書きメッセージが表示されるようにします。「Draft updated ....」:

add_filter('redirect_post_location','my_redirect_location',10,2);
function my_redirect_location($location,$post_id){
    //If post was published...
    if (isset($_POST['publish'])){
        //obtain current post status
        $status = get_post_status( $post_id );

        //The post was 'published', but if it is still a draft, display draft message (10).
        if($status=='draft')
            $location = add_query_arg('message', 10, $location)
    }

    return $location;
}

ただし、独自のメッセージを指定できます。 10は、各値がメッセージである配列キーを指します。 0は空白で、1〜9がデフォルトのメッセージ(公開後、更新など)です。

これはテストされていません)ただし、この配列に独自のメッセージを追加できます。

add_filter('post_updated_messages', 'my_custom_messages');
function my_custom_messages($messages){
    //$message is an array of arrays. 
    //$message['post_type'] is an array of messages for post type 'post_type'
    //It is a non-assocative array. Value for 0 is blank. Keys 1-9 hold the default messages

    //Add a custom message to key 21 for post type 'my_post_type'
    $messages['my_post_type'][21] = 'Looks like you tried publishing, but something went wrong';

  return $messages
}

次に、上記のように、メッセージを10ではなく21に設定できます。

5
Stephen Harris