查看此代码:
if( isset( $_POST [ \'add_like\' ] ) ){
$update = $like_value + \'1\';
update_post_meta($post_id, \'_like_value\', $update, $like_value);
}
因为您在循环中使用它,所以它在一个页面上以不同的值多次获得输出
$post_id
每次。所以基本上你有这个:
if( isset( $_POST [ \'add_like\' ] ) ){
update_post_meta(1, \'_like_value\', $update, $like_value);
}
if( isset( $_POST [ \'add_like\' ] ) ){
update_post_meta(2, \'_like_value\', $update, $like_value);
}
if( isset( $_POST [ \'add_like\' ] ) ){
update_post_meta(3, \'_like_value\', $update, $like_value);
}
因此,请考虑当
$_POST [ \'add_like\' ]
. 所有这些
if
s将是
true
因此,所有这些更新都将运行。
现在,您应该将处理更新和模板的逻辑分离开来。像这样把它们混在一起会带来麻烦。但是你的代码没有按你喜欢的方式工作的主要原因是你的表单没有提交你喜欢的帖子。
您需要添加具有正确帖子ID的隐藏输入,并在更新之前检查需要更新的帖子。
因此,请将输入添加到表单中:
<form name="update_post" method="POST" action="">
<button type="submit" name="add_like"><i class="fa fa-heart"></i></button>
<input name="post_id" type="hidden" value="<?php echo esc_attr( $post_id ); ?>">
</form>
然后在更新之前,检查提交的内容是否针对当前帖子:
<?php if( isset( $_POST[\'add_like\'] ) && isset( $_POST[\'post_id\'] ) && $_POST[\'post_id\'] === $post_id ) {
$update = $like_value + \'1\';
update_post_meta($post_id, \'_like_value\', $update, $like_value);
} ?>