使用表单更新前端中的帖子元数据

时间:2019-07-21 作者:Noufal Binu

如何从前端更新现有(后端)metabox变量,我尝试了很多次,但我不知道为什么这不起作用?只显示旧值而不更新,我做错了什么?

这是我的前端页面,我在普通页面中使用这段代码,带有短代码,也在post循环之间使用这段代码。

if ( isset( $_POST[\'zon_testimonial_nonce\'] ) && wp_verify_nonce($_POST[\'zon_testimonial_nonce\'],\'zon_testimonial\') )
    { //if nonce check succeeds.

        $post_id = $post->ID;
        $data = array(
            \'package\' => sanitize_text_field( $_POST[\'zon_package\'] )
        );
        update_post_meta( $post_id, \'_zon_testimonial_key\', $data );
    }


$data = get_post_meta($post->ID, \'_zon_testimonial_key\', true);
$package = isset($data[\'package\']) ? $data[\'package\'] : \'\';

print_r($_POST);
?>


<form method="post" action="">
   <?php wp_nonce_field(\'zon_testimonial\',\'zon_testimonial_nonce\'); ?>
   <label>This is label</label>
   <input type=\'text\' name=\'zon_package\' value=\'<?php echo $package; ?>\' />
   <input type=\'submit\' value=\'save\' />
</form>    

2 个回复
最合适的回答,由SO网友:nmr 整理而成

由于您在短代码中使用此代码,我想原因是缺少post ID。

您想从中获取当前帖子的ID$post 变量,但要使其成为可能,您需要添加global $post; 更早(在函数开始时,或至少在IF).

global $post;
if ( isset( $_POST[\'zon_testimonial_nonce\'] ) && 
     wp_verify_nonce($_POST[\'zon_testimonial_nonce\'],\'zon_testimonial\') )
您还可以使用get_queried_object_id() 函数获取当前查询对象的ID。

$post_id = get_queried_object_id();
if ( isset( $_POST[\'zon_testimonial_nonce\'] ) && 
     wp_verify_nonce($_POST[\'zon_testimonial_nonce\'],\'zon_testimonial\') )
{
    $data = array(
        \'package\' => sanitize_text_field( $_POST[\'zon_package\'] )
    );
    update_post_meta( $post_id, \'_zon_testimonial_key\', $data );
}
$data = get_post_meta($post_id, \'_zon_testimonial_key\', true);

SO网友:Jamy

你把这个脚本放在哪里?表格将提交至index.php 如果未指定窗体操作:

<form method="post" action="yourfile.php">