niestandardowe pole – wordpress prosta ocena wielu postów z post_meta i user_meta
Próbuję utworzyć funkcję oceny postów z wieloma kryteriami za pomocą prostej formy i post_meta oraz meta użytkownika.
Cel
kiedy użytkownicy przesyłają swoje oceny, powinny się wydarzyć 2 rzeczy:
1. oceny są przechowywane w post_meta o nazwie „wpd_rating” w następujący sposób:
array(user id => array(
field1 => 5
field2 => 3
field3 => 4
),
another user id => array(
field1 => 2
field2 => 5
field3 => 4
)
)
2. oceny są przechowywane w user_meta o nazwie „plgn_rating” w następujący sposób:
array(post id => array(
field1 => 5
field2 => 3
field3 => 4
),
another rated post id => array(
field1 => 2
field2 => 5
field3 => 4
)
)
Kod (oczywiście nie działa)
W single.php:
część nagłówka:
<?php // top of page
if ( isset( $_POST['drw_inventory'] ) && wp_verify_nonce($_POST['drw_inventory'],'update_drw_postmeta') )
{ //if nonce check succeeds.
global $post;
$postid = $post->ID;
$data = $_POST['wpd_function_rating'];
$data2 = $_POST['wpd_feature_rating'];
$data3 = $_POST['wpd_support_rating'];
$currentusr = get_current_user_id();
//*******************The post meta field Part****************************
//Get the Existing user ratings of this post
$ls_up_votes = get_post_meta($postid, 'wpd_rating');
//if the current user already rated, unset the rating
foreach ( $ls_up_votes as $key => $value )
{
if ( $key == $currentusr )
{
unset( $ls_up_votes[$key] );
}
}
//Add post meta 'wpd_rating' with this structure:
//array(userid => array('wpd_function_rating' => '3','wpd_feature_rating' => '5','wpd_support_rating' => '4',))
$up_vote = array($currentusr => array('wpd_function_rating' => $data,'wpd_feature_rating' => $data2,'wpd_support_rating' => $data3));
//appending new user ratings after one another
$ls_up_voted = array_merge($ls_up_votes, $up_vote);
update_post_meta($postid,'wpd_rating',$ls_up_voted);
//*******************The user field Part****************************
//Get the Current user ratings of this post
$user_rated_posts = get_user_meta($currentusr, 'plgn_rating',true);
foreach ( $user_rated_posts as $key => $value )
{
if ( $key == $postid )
{
unset( $user_rated_posts[$key] );
}
}
//add a user field 'plgn_rating' with this structure
//(postid => array('wpd_function_rating' => '3','wpd_feature_rating' => '5','wpd_support_rating' => '4',))
$usr_vote = array($postid => array('wpd_function_rating' => $data,'wpd_feature_rating' => $data2,'wpd_support_rating' => $data3));
//appending new user ratings after one another
$ls_up_voted = array_merge($user_rated_posts, $usr_vote);
update_user_meta($currentusr,'plgn_rating',$ls_up_voted);
}
?>
Formularz:
<form method="post" action="">
<?php wp_nonce_field('update_drw_postmeta','drw_inventory'); ?>
<label>This is label</label>
<input type="text" name="wpd_function_rating" value="" />
<input type="text" name="wpd_feature_rating" value="" />
<input type="text" name="wpd_support_rating" value="" />
<input type="submit" value="save" />
</form>
Problemy z bieżącym kodem
-
Tablica nie zapisuje się zgodnie z moją strukturą. Jestem prawie pewien, że źle używam array_merge. lub błędne wywołanie get_post_meta.
-
Kod nie sprawdza istniejącej oceny użytkownika i nie zastępuje starej oceny nową.
Aktualizacja
jak sugerował s_ha_dum, próbowałem tego bezskutecznie:
foreach ( $ls_up_votes as $key => $value ){
var_dump($key,$value);
if ( $key == $currentusr ){
unset( $ls_up_votes[$key] );
}
}
Kiedy dodam dane wejściowe użytkownika 2 razy, polecenia unset powinny usunąć poprzednią tablicę dodaną przez tego samego użytkownika i dodać nową, zamiast dodawać wszystkie 2 razy. Oto, co otrzymuję:
Array ( [0] => Array ( [0] => [1] => Array ( [wpd_function_rating] => 33 [wpd_feature_rating] => 23 [wpd_support_rating] => 66 ) ) [1] => Array ( [wpd_function_rating] => 44 [wpd_feature_rating] => 11 [wpd_support_rating] => 32 ) )