0

WordPress ブログのレベルアップ システムを作成しています。この問題はワードプレスよりも Php と数学に向けられていると思います。そのため、ここで質問しています。

レーティング (または xp と呼ぶことができます) カスタム フィールドが 25 の倍数になったときに、ユーザーに「レベル」を獲得してもらいたいです ( XP 要件を指数関数的に増加させたいと考えていますが、以下の要求 #2 を参照してください)。

これはfunctions.phpファイルにあります。

function movie_level() {
   if ( is_single() ) {
      global $post;
      $movie_level = get_post_meta( $post->ID, "movie_level", true);
      if ( !isset( $movie_level ) OR empty( $movie_level ) OR !is_numeric( $movie_level ) ) {
     $movie_level = 1;
     add_post_meta( $post->ID, "movie_level", $movie_level );
      }
  $vmeta = get_post_meta( get_the_ID(), 'ratings_score', true );
  $movie_percentage_check = $vmeta / ( 25*$movie_level ) * 100;
  if ( $movie_percentage_check == 100 ) {
         $new_level = $movie_level + 1;
         update_post_meta( $post->ID, "movie_level", $new_level );
         $update_rating = $vmeta + 1;
         update_post_meta( $post->ID, "ratings_score", $update_rating );
      } return $movie_level;
    }
 }

評価が 25 に達すると、movie_movie レベルに +1 が追加されます。

私のsingle.phpファイルには次のものがあります:

 $meta = get_post_meta( get_the_ID(), 'ratings_score', true );
 $level= movie_level();
 $perc = $meta / ( 25 * $level ) * 100;

 echo '<div class="progress large-6 small-12 columns "><span class="meter" style="width:'.$perc.'%"><span></span></span></div>';

 echo movie_level();

これは、進行状況バー css コンポーネントを使用して、次のレベルへの進行状況を表示します。

リクエスト

  1. 新しいレベルに到達したときに、$perc を再び 0% から開始するにはどうすればよいですか? 私の現在の方程式では、進行状況バーは、レベル 2 - レベル 3 ではなく、レベル 1 - レベル 3 (たとえば) から始まる進行状況を常に表示します。

  2. コードを更新して、レベルごとに評価の要件が指数関数的に増加し、要求 #1 で求めていたものを達成するにはどうすればよいですか?

4

1 に答える 1

1

必要のないいくつかのフープを飛び越えていると思いますが、最初にいくつかのメモがあります。

レベルを上げる必要があるかどうかをチェックしているmovie_level関数では、関連付けられた変数が変更されたときにそのチェックを行うだけで意味があります。つまり、movie_levelまたはを更新するときに変更を行いますratings_score。また、 を返しますが、追加した場合movie_levelは反映されないため、常に古いスコアを返します (新しいスコアを保存するために使用します)。それはあなたが意図していることかもしれませんが、そうではないと思います。+ 1new_level

あなたが答えようとしている重要な質問は、次のレベルまでどのくらいですか? 25 個のブロックの場合、次のレベルは(movie_level * 25)で、次のレベルまでの量は です(movie_level * 25) - rating_score。パーセンテージとしては((movie_level * 25) - rating_score) / 25(おそらく* 100必要に応じて)です。

これは、次のターゲットを変数として明示的に格納できる指数ブロックの場合、固定ブロックで機能します。level_target(x)ただし、関数が level の目標スコアを返すと仮定して、上記と同じロジックを適用できますx。次に、 でどこまで行くかを考え出すことができlevel_target(movie_level) - rating_scoreますが、そのレベルのサイズである を知る必要がありますlevel_target(movie_level) - level_target(movie_level - 1)

パーセンテージを取得するには、次のようにします。(level_target(movie_level) - rating_score)/(level_target(movie_level) - level_target(movie_level - 1))

関数として実装level_targetするか、必要なものを作成して直接組み込むことができます。これにより、方程式を単純化できます。

指数関数的なレベルの増加は非常に急速に大きくなるため、最大値が必要になる場合があります。でももしあなたが欲しければ

 0, 25, 50, 100, 200, 400 ...

あなたはそれが同等であることに注意することができます

 25 * 0, 25 * 1, 25 * 2, 25 * 4, 25 * 8, 25 * 16 ...

そして、シーケンス 0、1、2、4、8、16 ... は 2 のべき乗を増やしていることに注意してください。だからlevel_target(x) = 25 * pow(2,x)

次のターゲット レベルを別の変数として格納する方が便利な理由は、古いターゲット レベルを 2 倍にするだけで、2 の累乗を行う必要がなくなるからです (そして、レベルの差を計算できるためです)。常にレベル目標のちょうど半分になります)。

編集

私のフィールド変更コメントを明確にするために。rating_score が変更された後 (またはその逆) にのみ movie_level を再計算する必要があるため、通常、変数が変更された場合にのみ変数を再計算します。

あなたのアプリケーションはわかりませんが、movie_level や rating_score の値を変更できるページは 1 つだけ (スコアの編集ページなど) であると仮定しますが、進行状況バーをすべて表示する他のページが多数あるとします。値が変化するページのみをチェックする場合は($movie_percentage_check == 100)、他の場所をチェックする必要はありません (値は他の場所では変更できないため、真実ではないことがわかります)。

特に単純なサイトの場合、すべてのビュー ページでそれを確認することは必ずしも悪いことではありません。また、必要な場合もあります (システムの他の部分が何らかの方法で値を更新できる場合)。より複雑なシステムでは、必要のない作業を避けたいので、「編集」ページのみが値を変更し、「表示」ページは値を読み取り/使用する必要があります。

うまく説明できていないかもしれませんが、参考になれば幸いです。

于 2013-10-14T08:03:58.810 に答える