XPressME Integration Kit

フォーラム

Re: 記事一覧の設置

#3300
toemon
キーマスター

とりあえずはここまで作成してみましたが、後はそちらの方で調整してみてください。

“人気!”の代わりに“1位!”“2位!”のように順位を表示することもできたりしますでしょうか?

これも一応、盛り込んでみました。

popular_labelオプションで好きな文字にできます。文字列中に%sがあればそこに閲覧順位が挿入されます。

仕様

 人気ランキングや閲覧数などはXPressMEで独自追加したDBテーブル(wp_prefix + views)を利用していますので、WordPress単体ではこれらの機能は利用できません。

オプション

  • limit 表示件数を指定

     デフォルト値 空白

     空白の場合は全件数を表示

  • before <li>の直後に表示されるテキストを指定

     デフォルト値 文字無し

  • after </li>の直前に表示されるテキストを指定

     デフォルト値 文字無し

  • list_type リストタイプ(‘ul’または’ol’)を指定

     デフォルト値 ul

  • ol_type olの番号種類を指定

     デフォルト値 数値で表示

    設定値の種類

      ’1′: 数値(1,2,3)で表示

      ’i’: ローマ数値小文字(i,ii,iii)で表示

      ’I’: ローマ数値大文字(I,II,III)で表示

      ’a’: アルファベット小文字(a,b,c)で表示

      ’A’: アルファベット大文字(A,B,C)で表示

  • ol_start リスト番号のスタート値

     デフォルト値 1

     例 ol_start 3

      リスト番号が3,4,5…やC,D,E…として表示

  • li_value_revarse リスト番号を反転表示(リスト番号のみ)

     デフォルト値 false(偽)

     true(真)にした場合

      リスト番号が…3,2,1や…C,B,Aとして逆順に表示される。

  • show_revarse 検索結果を反転して表示

     デフォルト値 false(偽)

  • date_format_txt 日付フォーマットを指定

     デフォルト値 空白(WordPressの日付フォーマット指定に従う)

  • popular_ranking/popular_min_views 人気ランキングの表示条件

     popular_ranking 閲覧数による人気ランキングを表示する数(第何位まで)(閲覧数はXPressME のviewsテーブルを使用)

      デフォルト値 空白

     popular_min_views 人気ランキングの最低閲覧数

      デフォルト値 空白

     設定例

      popular_ranking指定なしpopular_min_view指定なしの場合、

       人気ランキングは表示されません。

      popular_ranking=10 popular_min_view=15の場合、

       閲覧数が15件以上のものの中から上位10件を人気ランキングとして表示します。

      popular_ranking=10 popular_min_view=指定なしの場合、

       閲覧数の多いものから上位10件を人気ランキングとして表示します。

      popular_ranking=指定なし popular_min_view=15の場合、

       閲覧数が15件以上のものを人気ランキングとして表示します。

  • popular_label 人気ランキングの表示文字列を指定

     デフォルト値 ’Popular No.%s!’ %s部にはランキング番号が入ります。

     指定文字列に%sがない場合はランキング番号が表示されません。

  • view_label 閲覧数表示文字列を指定します。

     デフォルト値 ’views:%s’,%s部には閲覧数が入ります。

     指定文字列に%sがない場合閲覧数は表示されません。

  • add_text_format 日付、閲覧数、人気ランキングの表示フォーマットを指定します。

     デフォルト値 ’ ([date]) ([views_num]) [popular] ‘

     [date]部には日付が入ります

     [views_num]には閲覧数(view_labelで設定したもの)が入ります。

     [popular]には人気文字(popular_label)で設定したもの)が入ります。

     設定例

      ’ ([date])<b><font color=”red”>[popular]</b> ‘

      括弧付きの日付に続き人気文字列(赤太字)を表示します。

      ’ <b><font color=”red”>[popular]</b>([date]) ‘

      上記例の日付と人気文字列の入れ替え

  • echo echoを行うかを設定します。

     デフォルト値 true

     true 処理結果をechoします

     false 処理結果をPHP値として返します

使用例(オプションの設定例)

 WordPressテーマファイルのループ外に書き込みます

 オプションを配列として渡す場合

<code><?php<br />
if (function_exists(wp_posts_list_ex)){<br />
$arg=array(<br />
'limit' => 4,<br />
'list_type' => 'ol',<br />
'ol_type'	=> 'A',<br />
'li_value_revarse' => true,<br />
'popular_ranking' => 5,<br />
'popular_label' => '人気 第%s位!'<br />
);<br />
wp_posts_list_ex($arg);<br />
}<br />
?></code>

 オプションを文字列として渡す場合

<code><?php<br />
if (function_exists(wp_posts_list_ex)){<br />
wp_posts_list_ex("limit=4&list_type=ol&li_value_revarse=1&popular_ranking=5&popular_label=人気 第%s位!");<br />
}<br />
?></code>

として利用します。

注意 文字列としてのオプション指定の場合trueやfalseは使えません1または0として指定してください。

プラグインのソース

このソースについてはサポートを行うつもりはありませんので、著作権を放棄します。そのため、プラグインへの署名は行っておりません。

プラグインインストール方法

以下の内容を含んだ’wp_posts_list_ex.php’というファイルを

wp-content/plugins/直下、あるいは

wp-content/plugins/wp_posts_list_ex/ディレクトりに作成設置してください。

設置後、WordPressプラグイン管理より有効にすることでプラグインが有効になります。

<code><?php<br />
/*<br />
Plugin Name: WP Posts List Ex for XPressME<br />
Plugin URI: http://exsample.com<br />
Description: WP Posts List Ex (custom function)<br />
Author: Foo<br />
Version: 1.0<br />
Author URI: http://exsample.com<br />
*/<br />
<br />
function wp_posts_list_ex($args = '') {<br />
global $wpdb, $wp_locale,$blog_id;<br />
<br />
if (empty($blog_id)) $blog_id =1;<br />
<br />
$defaults = array(<br />
'limit' => '',<br />
'before' => '',<br />
'after' => '',<br />
'list_type' => 'ul',			//Set value are 'ul' or 'ol'.<br />
'ol_type' => '',				//Set value are '1','a','A','i' or 'I'. Only enable if the OL tag is selectedvalue<br />
'ol_start' => '',<br />
'li_value_revarse' => false,	//Only enable if the OL tag is selected<br />
'show_reverse' => false,<br />
'date_format_txt' => '',<br />
'popular_ranking' => '',<br />
'popular_min_views' => '',<br />
'popular_label' => 'Popular No.%s!',<br />
'view_label' => 'views:%s',<br />
'add_text_format' => ' ([date]) ([views_num]) [popular] ',<br />
'echo' => true<br />
);<br />
<br />
$r = wp_parse_args( $args, $defaults );<br />
extract( $r, EXTR_SKIP );<br />
<br />
if ( '' != $limit ) {<br />
$limit = absint($limit);<br />
$limit = ' LIMIT '.$limit;<br />
}<br />
$views_table = $wpdb->prefix . 'views';<br />
<br />
if ($wpdb->get_var("show tables like '" . $views_table . "'") == $views_table){<br />
$views_table_exists = true;<br />
} else {<br />
$views_table_exists = false;<br />
}<br />
<br />
//filters<br />
$where = apply_filters( 'wp_posts_list_ex_where', "WHERE post_type = 'post' AND post_status = 'publish' AND post_date != '0000-00-00 00:00:00'", $r );<br />
$join = apply_filters( 'wp_posts_list_ex_join', '', $r );<br />
<br />
$orderby =  'post_date DESC ';<br />
if ($views_table_exists){<br />
$query = "SELECT * FROM $wpdb->posts LEFT JOIN $views_table ON($views_table.blog_id =$blog_id AND $wpdb->posts.ID = $views_table.post_id) $join $where ORDER BY $orderby $limit";<br />
} else {<br />
$query = "SELECT * FROM $wpdb->posts $join $where ORDER BY $orderby $limit";<br />
}<br />
$key = md5($query);<br />
$cache = wp_cache_get( 'wp_posts_list_ex' , 'general');<br />
if ( !isset( $cache[ $key ] ) ) {<br />
$arcresults = $wpdb->get_results($query);<br />
$cache[ $key ] = $arcresults;<br />
wp_cache_set( 'wp_posts_list_ex', $cache, 'general' );<br />
} else {<br />
$arcresults = $cache[ $key ];<br />
}<br />
<br />
$output = '';<br />
if ( $arcresults ) {<br />
$results_count = count($arcresults);<br />
// Reverse an array<br />
if($show_reverse) {<br />
$arcresults = array_reverse($arcresults);<br />
}<br />
//Setting the list tag<br />
if ($list_type=='ul'){<br />
$befor_tag = "<ul>n";<br />
$after_tag = "</ul>n";<br />
} else {<br />
//ol tag list-style-type setting<br />
switch($ol_type){<br />
case '1':<br />
$style = "style='list-style-type: decimal'";<br />
break;<br />
case 'a':<br />
$style = "style='list-style-type: lower-alpha'";<br />
break;<br />
case 'A':<br />
$style = "style='list-style-type: upper-alpha'";<br />
break;<br />
case 'i':<br />
$style = "style='list-style-type: lower-roman'";<br />
break;<br />
case 'I':<br />
$style = "style='list-style-type: upper-roman'";<br />
break;<br />
default:<br />
$style ='';<br />
}<br />
//ol tag start setting<br />
if (!empty($ol_start) &&  is_numeric($ol_start)){<br />
$start = 'start='. $ol_start;<br />
} else {<br />
$start = '';<br />
}<br />
<br />
$befor_tag = "<ol $start $style>n";<br />
$after_tag = "</ol>n";<br />
}<br />
<br />
$output .= $befor_tag;<br />
<br />
//	Popular Post ID into an array<br />
if($views_table_exists && (is_numeric($popular_ranking) || is_numeric($popular_min_views))){<br />
<br />
//Setting the Number of popular View<br />
if ( is_numeric($popular_ranking) ) {<br />
$popular_limit = absint($popular_ranking);<br />
$popular_limit = ' LIMIT '.$popular_ranking;<br />
} else {<br />
$popular_limit = '';<br />
}<br />
//Setting the minimum number of popular<br />
if(is_numeric($popular_min_views)){<br />
$popular_where = "WHERE blog_id =$blog_id AND post_views >= $popular_min_views";<br />
} else {<br />
$popular_where = "WHERE blog_id =$blog_id";<br />
}<br />
//Extraction of popular posts<br />
$popular_query = "SELECT * FROM $views_table $popular_where ORDER BY post_views DESC $popular_limit";<br />
$populars = $wpdb->get_results($popular_query);<br />
//Popular Post ID into an array<br />
$popular_array= array();<br />
foreach ($populars as $popular) {<br />
$popular_array[] = $popular->post_id;<br />
}<br />
}<br />
foreach ( (array) $arcresults as $arcresult ) {<br />
$url  = get_permalink( $arcresult );<br />
// post date<br />
if ( '' == $date_format_txt ){<br />
$the_date = mysql2date(get_option('date_format'), $arcresult->post_date);<br />
} else {<br />
$the_date = mysql2date($date_format_txt, $arcresult->post_date);<br />
}<br />
if ( $arcresult->post_title )<br />
$title_text = strip_tags( apply_filters( 'the_title', $arcresult->post_title, $arcresult->ID ) );<br />
else<br />
$title_text = $arcresult->ID;<br />
<br />
// popular & views num<br />
$popular_text = '';<br />
$views_num = '';<br />
if($views_table_exists){<br />
$lank_order = array_search($arcresult->ID,$popular_array);<br />
if($lank_order !== false){<br />
$order_num = $lank_order +1;<br />
$popular_text = sprintf($popular_label,$order_num) ;<br />
}<br />
$views_num = sprintf($view_label,$arcresult->post_views) ;<br />
}<br />
<br />
$add_text = preg_replace('/[date]/', $the_date, $add_text_format);<br />
$add_text = preg_replace('/[views_num]/', $views_num, $add_text);<br />
$add_text = preg_replace('/[popular]/', $popular_text, $add_text);<br />
<br />
if ($li_value_revarse){<br />
$li_attr = ' value="' . $results_count-- . '"';<br />
} else {<br />
$li_attr =	'';<br />
}<br />
$output .= "t<li{$li_attr}>{$before}<a href='$url' title='{$title_text}'>{$title_text}</a>{$add_text}{$after}</li>n";<br />
<br />
}<br />
$output .= $after_tag;<br />
}<br />
if ( $echo )<br />
echo $output;<br />
else<br />
return $output;<br />
}<br />
?></code>