0

我正在为 wordpress 博客创建升级系统。我相信这个问题更多地是针对 Php 和数学而不是 wordpress,这就是我在这里问这个问题的原因。

我希望用户在评级(或者您可以称之为 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% 开始?使用我当前的方程式,进度条将始终显示从 1 级 - 3 级(例如)开始的进度,而不是 2 级 - 3 级。

  2. 如何更新我的代码,以便每个级别的评级要求呈指数增长,并且仍然达到我在请求 #1 中想要的

4

1 回答 1

1

我认为您正在跳过一些您不需要的箍,但首先要注意几个音符。

movie_level您检查级别是否需要增加的函数中,只有在关联变量发生更改时进行检查才有意义——即在更新movie_levelratings_score. 你也 return movie_level,但这并不反映+ 1你是否添加了它,所以你总是返回旧分数(因为你new_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 的幂(并且您可以计算出它级别的差异,因为它'将永远是水平目标的一半)。

编辑

澄清我的字段更改评论。您只需要在 rating_score 更改后重新计算movie_level(反之亦然),因此通常您只会在变量发生更改时重新计算。

我不知道您的应用程序,但假设只有一个页面可以更改 movie_level 和/或 rating_score 的值(例如编辑分数页面),但还有许多其他页面都显示进度条。如果您($movie_percentage_check == 100)仅在值更改的页面上检查,则无需检查其他任何地方(因为值无法在其他任何地方更改,因此您可以知道它不是真的)。

在所有视图页面上检查它并不一定是坏事,特别是对于一个简单的站点。在某些情况下,您需要(如果系统的其他部分可以以某种方式更新值)。在更复杂的系统中,您希望避免做您不需要的工作,因此只有“编辑”页面应该更改值,“查看”页面应该只读取/使用这些值。

我可能没有解释得很好,希望对您有所帮助。

于 2013-10-14T08:03:58.810 回答