class-wpseo-rank.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. <?php
  2. /**
  3. * WPSEO plugin file.
  4. *
  5. * @package WPSEO\Internals
  6. */
  7. /**
  8. * Holder for SEO Rank information
  9. */
  10. class WPSEO_Rank {
  11. const BAD = 'bad';
  12. const OK = 'ok';
  13. const GOOD = 'good';
  14. const NO_FOCUS = 'na';
  15. const NO_INDEX = 'noindex';
  16. /**
  17. * @var array All possible ranks.
  18. */
  19. protected static $ranks = array(
  20. self::BAD,
  21. self::OK,
  22. self::GOOD,
  23. self::NO_FOCUS,
  24. self::NO_INDEX,
  25. );
  26. /**
  27. * Holds the translation from seo score slug to actual score range
  28. *
  29. * @var array
  30. */
  31. protected static $ranges = array(
  32. self::NO_FOCUS => array(
  33. 'start' => 0,
  34. 'end' => 0,
  35. ),
  36. self::BAD => array(
  37. 'start' => 1,
  38. 'end' => 40,
  39. ),
  40. self::OK => array(
  41. 'start' => 41,
  42. 'end' => 70,
  43. ),
  44. self::GOOD => array(
  45. 'start' => 71,
  46. 'end' => 100,
  47. ),
  48. );
  49. /**
  50. * @var int
  51. */
  52. protected $rank;
  53. /**
  54. * @param int $rank The actual rank.
  55. */
  56. public function __construct( $rank ) {
  57. if ( ! in_array( $rank, self::$ranks, true ) ) {
  58. $rank = self::BAD;
  59. }
  60. $this->rank = $rank;
  61. }
  62. /**
  63. * Returns the saved rank for this rank.
  64. *
  65. * @return string
  66. */
  67. public function get_rank() {
  68. return $this->rank;
  69. }
  70. /**
  71. * Returns a CSS class for this rank
  72. *
  73. * @return string
  74. */
  75. public function get_css_class() {
  76. $labels = array(
  77. self::NO_FOCUS => 'na',
  78. self::NO_INDEX => 'noindex',
  79. self::BAD => 'bad',
  80. self::OK => 'ok',
  81. self::GOOD => 'good',
  82. );
  83. return $labels[ $this->rank ];
  84. }
  85. /**
  86. * Returns a label for this rank
  87. *
  88. * @return string
  89. */
  90. public function get_label() {
  91. $labels = array(
  92. self::NO_FOCUS => __( 'Not available', 'wordpress-seo' ),
  93. self::NO_INDEX => __( 'No index', 'wordpress-seo' ),
  94. self::BAD => __( 'Needs improvement', 'wordpress-seo' ),
  95. self::OK => __( 'OK', 'wordpress-seo' ),
  96. self::GOOD => __( 'Good', 'wordpress-seo' ),
  97. );
  98. return $labels[ $this->rank ];
  99. }
  100. /**
  101. * Returns a label for use in a drop down
  102. *
  103. * @return mixed
  104. */
  105. public function get_drop_down_label() {
  106. $labels = array(
  107. self::NO_FOCUS => __( 'SEO: No Focus Keyword', 'wordpress-seo' ),
  108. self::BAD => __( 'SEO: Needs improvement', 'wordpress-seo' ),
  109. self::OK => __( 'SEO: OK', 'wordpress-seo' ),
  110. self::GOOD => __( 'SEO: Good', 'wordpress-seo' ),
  111. self::NO_INDEX => __( 'SEO: Post Noindexed', 'wordpress-seo' ),
  112. );
  113. return $labels[ $this->rank ];
  114. }
  115. /**
  116. * Gets the drop down labels for the readability score.
  117. *
  118. * @return string The readability rank label.
  119. */
  120. public function get_drop_down_readability_labels() {
  121. $labels = array(
  122. self::BAD => __( 'Readability: Needs improvement', 'wordpress-seo' ),
  123. self::OK => __( 'Readability: OK', 'wordpress-seo' ),
  124. self::GOOD => __( 'Readability: Good', 'wordpress-seo' ),
  125. );
  126. return $labels[ $this->rank ];
  127. }
  128. /**
  129. * @return int The starting score for this rank.
  130. */
  131. public function get_starting_score() {
  132. // No index does not have a starting score.
  133. if ( self::NO_INDEX === $this->rank ) {
  134. return -1;
  135. }
  136. return self::$ranges[ $this->rank ]['start'];
  137. }
  138. /**
  139. * @return int The end score for this rank.
  140. */
  141. public function get_end_score() {
  142. // No index does not have an end score.
  143. if ( self::NO_INDEX === $this->rank ) {
  144. return -1;
  145. }
  146. return self::$ranges[ $this->rank ]['end'];
  147. }
  148. /**
  149. * Returns a rank for a specific numeric score
  150. *
  151. * @param int $score The score to determine a rank for.
  152. *
  153. * @return self
  154. */
  155. public static function from_numeric_score( $score ) {
  156. // Set up the default value.
  157. $rank = new self( self::BAD );
  158. foreach ( self::$ranges as $rank_index => $range ) {
  159. if ( $range['start'] <= $score && $score <= $range['end'] ) {
  160. $rank = new self( $rank_index );
  161. break;
  162. }
  163. }
  164. return $rank;
  165. }
  166. /**
  167. * Returns a list of all possible SEO Ranks
  168. *
  169. * @return WPSEO_Rank[]
  170. */
  171. public static function get_all_ranks() {
  172. return array_map( array( 'WPSEO_Rank', 'create_rank' ), self::$ranks );
  173. }
  174. /**
  175. * Returns a list of all possible Readability Ranks
  176. *
  177. * @return WPSEO_Rank[]
  178. */
  179. public static function get_all_readability_ranks() {
  180. return array_map( array( 'WPSEO_Rank', 'create_rank' ), array( self::BAD, self::OK, self::GOOD ) );
  181. }
  182. /**
  183. * Converts a numeric rank into a WPSEO_Rank object, for use in functional array_* functions
  184. *
  185. * @param string $rank SEO Rank.
  186. *
  187. * @return WPSEO_Rank
  188. */
  189. private static function create_rank( $rank ) {
  190. return new self( $rank );
  191. }
  192. }