WordPress

niestandardowe pole – wordpress prosta ocena wielu postów z post_meta i user_meta

  • 4 lutego, 2014
  • 4 min read
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

  1. 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.

  2. Kod nie sprawdza istniejącej oceny użytkownika i nie zastępuje starej oceny nową.

Warto przeczytać!  wtyczki — Błąd krytyczny w moim WP „Wywołanie niezdefiniowanej funkcji get_option()”

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 ) ) 


Źródło