我从meta值中获得了post id,并使用while循环来显示它们。现在我的问题是,我还需要一个表单来为每个帖子id添加另一个元键“rank”的元值(例如1,2,3)。
$args = array(
\'meta_key\' => \'e_id\',
\'meta_value\' => $eid,
\'post_type\' => \'rsvp\',
\'post_status\' => \'any\',
\'posts_per_page\' => -1
);
$the_query = new WP_Query( $args ); ?>
<form action="" method="post"><?
if ( $the_query->have_posts() ) :
while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<input type=\'text\' name=\'rank\' ><?
endwhile;
endif;?>
<input type="submit" name="submitBtn" value="Update"/>
</form>
由于表单在单击提交按钮后将保持在同一页面上,所以我也做了类似的操作,但它没有按预期工作。
if(isset($_POST[\'submitBtn\'])){
add_post_meta($post->ID, \'rank\', $_REQUEST[\'rank\'], true);
}
我真的不知道该把它放在哪里,以及如何使它与循环一起工作。
提前感谢!
最合适的回答,由SO网友:Paul G 整理而成
您应该使用init
行动挂钩。从codex: init对于拦截$\\u GET或$\\u POST触发器很有用
以下代码只是一个示例,未经测试:
function wpse283607_handle_submit()
{
// check if form is POSTed and nonce is valid
if ( \'POST\' === $_SERVER[\'REQUEST_METHOD\']
&& wp_verify_nonce( $_REQUEST[\'_wpnonce\'], \'my-action\' ) ) {
if ( !empty( $_REQUEST[\'rank\'] ) ) {
$ranks = (array) $_REQUEST[\'rank\'];
foreach ( $ranks as $post_id => $rank ) {
add_post_meta( intval( $post_id ), \'rank\', intval( $rank ) );
}
}
// redirect to the same page (to avoid re-submit form data on browser reload/refresh)
wp_safe_redirect(
remove_query_arg( [ \'_wp_http_referer\', \'_wpnonce\' ], wp_unslash( $_SERVER[\'REQUEST_URI\'] ) )
);
exit;
}
}
add_action( \'init\', \'wpse283607_handle_submit\' );
然后你的
<form>
看起来像:
<form action="" method="post"><?
wp_nonce_field( \'my-action\' );
/**
* @var \\WP_Query $the_query
*/
if ( $the_query->have_posts() ) :
$i = 1; // not sure how you generate your "rank" but just an example
while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<input type=\'text\' name=\'rank[<?php echo $post->ID ?>]\' value="<?php echo $i ?>" /><?
$i++;
endwhile;
wp_reset_postdata();
endif; ?>
<input type="submit" name="submitBtn" value="Update" />
</form>