在wordpress中按字数统计帖子

时间:2015-08-01 09:58:17

标签: php wordpress sorting

我需要获取每个帖子的字数并根据该顺序显示帖子。我需要这个来识别字数最少的帖子并对它们进行处理。

到目前为止,我已经能够根据每个帖子的单词计数创建一个数组,并使用sort($wc, SORT_NUMERIC)对它们进行排序。除此之外,我无法根据此订单显示帖子。

$args = array('post_type' => 'post', 'posts_per_page' => 20, 'post_status' => 'publish'); 
   $results = get_posts($args);
   $wc = array(); 
   //$p_id = array(); //how do i use this ?       
       foreach($results as $r){
       $wc[] = str_word_count( strip_tags( $r->post_content ));
       //$p_id[] = $->ID; //how do i use this ?
       }
   sort($wc, SORT_NUMERIC);

您知道,我知道另一种选择,您将这些值保存为自定义元字段,然后显示'meta_value_num'的帖子,但我不允许采取该路线。知道如何做到这一点? TIA。

这就是我一直在尝试这样的事情:但它不考虑post ids。我想它需要像一个关联数组或其他东西。

 foreach ($wc as $key => $val) {
            echo $key.' => ' .$val . '<br>';
            }

理想的结果看起来像这样,因为我还需要显示相关的帖子标题。

 1. Post title => 369
 2. Another post title => 548
 3. Yet another title => 895

更新 - 它适用于已接受答案中提供的解决方案。如果你能提出更好的解决方案,请写下答案。

2 个答案:

答案 0 :(得分:2)

不需要有一个字数组和一个按其索引映射的帖子标题数组。您可以创建一个由post title索引的数组,并将count作为值,然后使用asort按数值对数组进行排序,同时保持索引:

$args = array( 'post_type' => 'post', 'posts_per_page' => 20, 'post_status' => 'publish' );
$results = get_posts( $args );

$posts = array();

foreach ( $results as $result ) {
    $posts[ $result->post_title ] = str_word_count( strip_tags( $result->post_content ) );
}

asort( $posts, SORT_NUMERIC );

die( print_r( $posts ) );

如果您想以相反的顺序对数组进行排序,则只需使用arsort代替asort

答案 1 :(得分:1)

我认为$ wc应该是一个带有“title”和“words of words”的多维数组,然后你可以使用array_mulisort。 尝试这样的想法:

foreach($results as $r){
  $wc[] = array('title' => $r->post_title, 'nb_words' => str_word_count( strip_tags( $r->post_content )));
}
foreach($wc as $key => $post) {
  $nb_words[$key] = $post['nb_words'];
  $title[$key] = $post['title'];
}
array_multisort($nb_words, SORT_ASC, $title, SORT_ASC, $wc);

更新 - 这是使用array_multisort的更短更好的方法:

$args = array('post_type' => 'post', 'posts_per_page' => 20, 'post_status' => 'publish'); 
$results = get_posts($args);
$nb_words = array();
$title = array();
foreach($results as $r){
  $nb_words[] = str_word_count( strip_tags( $r->post_content ));
  $title[] = $r->post_title;
}
array_multisort($nb_words, SORT_ASC, SORT_NUMERIC, $title);
for ($i = 0; $i < sizeof($title); $i++) {
  echo $title[$i] . ' => ' . $nb_words[$i] . '<br>';
}