私はnonceを作成して検証しようとしています、そしてそれは wp_create_nonce で説明されているのとほぼ同じ方法で行いました。
私はそれがREST apiに関連していると思いますが、どこを調査すればよいかわかりませんか?
ナンスを作成する方法:
(私はHTMLを作成するためのコードを返すREST関数を持っています。これはHTMLを正しく作成し、結果として得られるwp_create_nonce()の値は正しく埋められます)
/***
* Display customers/vendors in table format
***/
if( !function_exists( 'fnc_view_customer_vendor_in_table_format' ) ) {
/**
* @param WP_REST_Request $request
* @return mixed|string|void
*/
function fnc_view_customer_vendor_in_table_format(WP_REST_Request $request ) {
$_search_name = $request['_search_name'];
$_posttype = $request['_posttype'];
if( $_posttype == null ) {
$result = array( 'msg' => 'ERROR: Please try again', 'error' => true );
return json_encode( $result );
}
$data = '<table class="table widefat table-striped">';
$data .= '<thead>';
$data .= '<tr>';
$data .= '<th class="col-name">Name</th>';
$data .= '<th class="col-phone">Phone</th>';
$data .= '<th class="col-email">Fax</th>';
$data .= '<th class="col-email">Email</th>';
$data .= '<th class="col-website">Website</th>';
$data .= '<th class="col-action">Actions</th>';
$data .= '</tr>';
$data .= '</thead>';
$data .= '<tbody>';
$args = array(
'post_type' => $_posttype,
'post_status' => 'publish',
'posts_per_page' => -1
);
if( $_search_name ) {
$search_args = array(
's' => $_search_name
);
$args = wp_parse_args( $args, $search_args );
}
$posts = get_posts( $args );
$del_page = get_permalink( fnc_get_id_by_slug_and_posttype( 'delete-instance', 'page' ) );
foreach( $posts as $post ) :
$post_type = get_post_type( $post->ID );
$data .= '<tr>';
$data .= '<th class="col-name">';
$data .= get_the_title( $post->ID );
$data .= '</th>';
$data .='<th class="col-phone">';
$data .= get_post_meta( $post->ID, '_phone', true );
$data .= '</th>';
$data .= '<th class="col-fax">';
$data .= get_post_meta( $post->ID, '_fax', true );
$data .= '</th>';
$data .= '<th class="col-email">';
$data .= get_post_meta( $post->ID, '_email', true );
$data .= '</th>';
$data .= '<th class="col-website">';
$data .= '<a href="'.get_post_meta( $post->ID, '_website', true ).'" target = "_new">';
$data .= get_post_meta( $post->ID, '_website', true );
$data .= '</a>';
$data .= '</th>';
$data .='<th class="col-action">';
$data .='<div class="col-action-btn">';
$data .='<div class="col-action-edit">';
$data .='<form action="' . get_permalink( $post->ID ) . '" id="form-edit" name="form-edit" method="post">';
$data .='<!-- Noncename needed to verify where the data originated -->';
$data .= '<input type="hidden" id="_wpnonce" name="_wpnonce" value="'. wp_create_nonce( 'edit_post-'. $post->ID ) .'" />';
$data .= '<input type="hidden" name="_wp_http_referer" value="/test/lists/view-vendors" />';
$data .= '<input type="hidden" id="post_id" name="post_id" value="'. $post->ID .'" />';
$data .='<input type="hidden" name="mode" value="edit">';
$data .='<input type="submit" class="btn btn-small" value="Edit">';
$data .='</form>';
$data .='</div>';
/*
$data .='<div class="col-action-delete">';
$data .= '<form action="' . $del_page . '" id="form-delete" name="form-delete" method="post" />';
$data .= '<!-- Noncename needed to verify where the data originated -->';
$data .= '<input type="hidden" id="_wpnonce" name="_wpnonce" value="'. wp_create_nonce() .'" />';
$data .='<input type="hidden" name="mode" value="delete" />';
$data .='<input type="hidden" name="del_post_id" value=" ' .$post->ID . '" />';
$data .='<input type="hidden" name="del_post_type" value=" ' .$post_type . '" />';
$data .='<input type="submit" class="btn btn-small" value="Delete" />';
$data .='</form>';
*/
$data .= '</th>';
$data .= '</tr>';
endforeach;
$data .= '</tbody>';
$data .= '</table>';
$result = array( 'msg' => $data, 'error' => false );
return json_encode( $result );
}
}
ナンスを検証する方法:
// Nonce from other pages
$nonce = $_REQUEST['_wpnonce'];
$post_id = $_REQUEST['post_id'];
print_r( $_POST );
// prints Array ( [_wpnonce] => 47f80a1859 [_wp_http_referer] => /test/lists/view-vendors [post_id] => 19793 [mode] => edit )
echo '<br/>';
echo '<br/>';
var_dump( wp_verify_nonce( $nonce, 'edit_post-'. $post_id ) );
// prints bool(false)
echo '<br/>';
echo '<br/>';
if ( !wp_verify_nonce( $nonce, 'edit_post-'. $post_id ) ) {
print $GLOBALS['doumi']['nonce_fail_msg'];
echo '</main></div>';
get_footer();
die();
}
フォームのマークアップの3行目では、2つの引数を wp_create_nonce
に渡すときに1つしか受け付けません。それは単純なタイプミスです。文字列を次のように連結します。
wp_create_nonce( 'edit_post-'. $post->ID ) //dot instead of comma
編集:これはnonceフィールドのための一般的な(デフォルトの)Wordpress名であるため、nonceフィールドに_wpnonce
よりもより具体的な名前を付けることをお勧めします。たぶん、このようなことを試してください:
// change the NONCE name to something unique
$data .= '<input type="hidden" id="wpse263026_nonce" name="wpse263026_nonce" value="'. wp_create_nonce( 'edit_post-'. $post->ID ) .'" />';