チュートリアルに従って、カスタムメタボックスをテーマに追加しようとしています。 https://www.sitepoint.com/adding-meta-boxes-post-types-wordpress/ .
私はメタボックスを見ることができ、それはデータベースから値を取得します(手動でpost-metaを更新することによって試みられます)。しかし、それは決して更新されません。 var_dump()を使って$_POST
配列をデバッグしてみました。変数の値は空ですが、値は$_REQUEST
にあります。誰もがこの理由を知っていますか?
不足している変数はpost-excerpt
です。これが私のコードです。
function buziness_add_custom_box() {
// Adding layout meta box for page
add_meta_box(
'offer-post-excerpt',
esc_html__( 'Excerpt', 'buziness'),
'buziness_post_excerpt',
'post',
'normal',
'default'
);
}
次はコールバック関数です:
function buziness_post_excerpt($post){
// Add a nonce field so we can check for it later
// Use nonce for verification
wp_nonce_field( basename( __FILE__ ) , 'custom_excerpt_nonce' );
$value = get_post_meta($post->ID, '_excerpt', true );
echo '<textarea style="width:100%" id="post_excerpt" name="post_excerpt">' . esc_attr( $value ) . '</textarea>';
echo "<p>Excerpts are optional hand-crafted summaries of your content that can be used in your theme</p>";
}
これはsave_post
フックにフックされた関数です
add_action('save_post', 'buziness_save_post_excerpt');
/**
* save the custom excerpt metabox data
* @hooked to save_post hook
*/
function buziness_save_post_excerpt($post_id) {
// Checks save status
var_dump($_POST);
var_dump($_REQUEST);
wp_die($_REQUEST);
$is_autosave = wp_is_post_autosave( $post_id );
$is_valid_nonce = ( isset( $_POST[ 'custom_excerpt_nonce' ] ) && wp_verify_nonce( $_POST[ 'custom_excerpt_nonce' ], basename( __FILE__ ) ) ) ? 'true' : 'false';
// Exits script depending on save status
if ( $is_autosave || !$is_valid_nonce ) {
return;
}
// Check the user's permissions.
if ( isset( $_POST['post_type'] ) && 'post' == $_POST['post_type'] ) {
if ( ! current_user_can( 'edit_page', $post_id ) ) {
return;
}
}
else {
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
}
// Checks for input and sanitizes/saves if needed
if( isset( $_POST[ 'post_excerpt' ] ) ) {
update_post_meta( $post_id, '_excerpt', sanitize_text_field( $_POST[ 'post_excerpt' ] ) );
}
}
これはvar_dump($_POST)
からの出力の一部です。
'ping_status' => string 'open' (length=4)
'add_comment_nonce' => string 'c641d598b3' (length=10)
'_ajax_fetch_list_nonce' => string '1e9f1f3f06' (length=10)
'post_name' => string 'online-training' (length=15)
'post_author_override' => string '1' (length=1)
'custom_excerpt_nonce' => string '0cd0a833c4' (length=10)
'post_excerpt' => string '' (length=0)
'post_mime_type' => string '' (length=0)
'ID' => int 96
そしてvar_dump($_REQUEST)
からの出力の一部
'ping_status' => string 'open' (length=4)
'add_comment_nonce' => string 'c641d598b3' (length=10)
'_ajax_fetch_list_nonce' => string '1e9f1f3f06' (length=10)
'post_name' => string 'online-training' (length=15)
'post_author_override' => string '1' (length=1)
'custom_excerpt_nonce' => string '0cd0a833c4' (length=10)
'post_excerpt' => string 'TES t ' (length=6)
ご覧のとおり、post_excerpt
の出力では '$_POST
'の値は空です。
$_REQUEST
を使うのは悪い習慣です。 post
リクエスト、get
リクエスト、およびcookieの間では、実際のユーザ入力を処理していることを確信できず、URLやブラウザのメモリにゴミが残っているわけではありません。
メタボックスは "投稿"されているので、それらを処理するときは$_POST
のみを使用してください。
あなたのコードの他の側面は、あなたが "あなたのコード"に属さないものにアクセスしようとしているということです。グローバルな場所からアクセスするのではなく、常にそのためのAPIを使用することをお勧めします。私が誰かがそれをする理由はわからないが、ある時点ではある人は想像上の(あるいは想像上の理由ではない)理由で何らかの値を$_POST
から削除することをお勧めします。さらに、セーブハンドラのようなAPIは、ブラウザからは発生しなかった「セーブ」を処理するために呼び出されます。空またはゴミが入っています。
Ohhhhhhhhhhhhあなたは自分のフィールドの名前を使っていますが、名前の頭には付けられていません。それはそれ自体でワームの大きな缶です。グローバルスコープにあるすべてのものに常に接頭辞を付けます。