エントリー一覧ウィジェット

MTの<MTEntries>のように、「そのカテゴリーに属するエントリー」をサイドに簡単に表示したかったがためにウィジェットを自作しました。
テーマファイルのfunction.php末尾に下記コードを追加で「エントリー一覧」のウィジェットを追加します。


<?php
// エントリー一覧表示ウィジェット
register_sidebar_widget(__('エントリー一覧','entries'), 'widget_entries');
register_widget_control( 'エントリー一覧', 'sample_control' );

function widget_entries($args){//出力側定義
$ets_category_dynamic = get_option('ets_category_dynamic');
if($ets_category_dynamic == "on"){
$cat = get_the_category();
$cat = $cat[0];
$ets_category = $cat->cat_ID;
} else {
$ets_category = get_option('ets_category');
}

$ets_title = get_option('ets_title');
$title = empty($ets_title) ? __('エントリー一覧' ,'entries') : $ets_title;

$ets_numberposts = get_option('ets_numberposts');
$ets_offset = 0;
$ets_orderby = get_option('ets_orderby');
$ets_order = get_option('ets_order');
$ets_include = '';
$ets_exclude = '';
$ets_meta_key = '';
$ets_meta_value = '';
$ets_post_type = 'post';
$ets_post_parent = '0';

extract($args);
echo $before_widget."\n";
echo $before_title . $title . $after_title."\n";
echo '<ul>'."\n";

$myposts = get_posts('numberposts='.$ets_numberposts.'&offset='.$ets_offset.'&category='.$ets_category.'&orderby='.$ets_orderby.'&order='.$ets_order.'&include='.$ets_include.'&exclude='.$ets_exclude.'&meta_key='.$ets_meta_key.'&meta_value='.$ets_meta_value.'&post_type='.$ets_post_type.'&post_parent='.$ets_post_parent);
foreach($myposts as $post) :
echo '    <li><a href="' . get_permalink($post->ID) . '">'.$post->post_title.'</a></li>'."\n";
endforeach;
echo '</ul>'."\n";
echo $after_widget."\n";
}
function sample_control(){//ダッシュボード側定義
$ets_numberposts = get_option('ets_numberposts');
if (isset($_POST['ets_numberposts'])) {
update_option('ets_numberposts', $_POST['ets_numberposts']);
}
$ets_title = get_option('ets_title');
if (isset($_POST['ets_title'])) {
update_option('ets_title', $_POST['ets_title']);
}
$ets_category = get_option('ets_category');
if (isset($_POST['ets_category'])) {
update_option('ets_category', $_POST['ets_category']);
}
$ets_category_dynamic = get_option('ets_category_dynamic');
if (isset($_POST['ets_category_dynamic'])) {
update_option('ets_category_dynamic', $_POST['ets_category_dynamic']);
}
$ets_orderby = get_option('ets_orderby');
if (isset($_POST['ets_orderby'])) {
update_option('ets_orderby', $_POST['ets_orderby']);
}
$ets_order = get_option('ets_order');
if (isset($_POST['ets_order'])) {
update_option('ets_order', $_POST['ets_order']);
}
?>
<p><label for="ets_title"><?php _e('タイトル:','entries') ?>
<input id="ets_title" name="ets_title" type="text" value="<?php echo $ets_title; ?>" /></label></p>

<p><label for="ets_numberposts"><?php _e( '表示記事数:','entries' ) ?>
<input id="ets_numberposts" name="ets_numberposts" type="text" size="3" value="<?php echo $ets_numberposts; ?>" /></label>&nbsp;<small>(0なら無限)</small></p>

<p><?php _e( '表示カテゴリ:','entries' ) ?>
<?php wp_dropdown_categories('selected='.$ets_category.'&name=ets_category&class=ets_category'); ?><br />
<?php _e( 'カテゴリ別動的表示:','entries' ); ?><label for="ets_category_dynamic_1"><input id="ets_category_dynamic_1" name="ets_category_dynamic" type="radio" value="on"<?php if($ets_category_dynamic == "on"){?> checked="checked"<?php } ?> />ON</label>&nbsp;<label for="ets_category_dynamic_2"><input id="ets_category_dynamic_2" name="ets_category_dynamic" type="radio" value="off"<?php if($ets_category_dynamic == "off"){?> checked="checked"<?php } ?> />OFF</label><br /><small>(ONは表示カテゴリ指定を無視します)</small></p>

<p><?php _e('ソート項目:','entries') ?>
<select name="ets_orderby">
<option value="post_title"<?php if($ets_orderby == "post_title"){ ?>selected="selected"<?php } ?>>記事タイトル</option>
<option value="post_date"<?php if($ets_orderby == "post_date"){ ?>selected="selected"<?php } ?>>投稿日</option>
<option value="post_modified"<?php if($ets_orderby == "post_modified"){ ?>selected="selected"<?php } ?>>更新日</option>
<option value="ID"<?php if($ets_orderby == "ID"){ ?>selected="selected"<?php } ?>>記事ID</option>
<option value="post_author"<?php if($ets_orderby == "post_author"){ ?>selected="selected"<?php } ?>>投稿者ID</option>
<option value="post_name"<?php if($ets_orderby == "post_name"){ ?>selected="selected"<?php } ?>>スラッグ</option>
</select>
</p>

<p><?php _e('ソート順:','entries') ?>
<label for="ets_order_asc"><input id="ets_order_asc" name="ets_order" type="radio" value="ASC"<?php if($ets_order == "ASC"){?> checked="checked"<?php } ?> />昇順</label>&nbsp;<label for="ets_order_desc"><input id="ets_order_desc" name="ets_order" type="radio" value="DESC"<?php if($ets_order == "DESC"){?> checked="checked"<?php } ?> />降順</label></p>

<input type="hidden" id="sample-submit" name="sample-submit" value="1" />
<?php
}
?>

ウィジェット設定画面より一応いくつかの設定ができるよう作っています。

PHPがまともにできる人間ではないのでスンごいバタくさいコードかも知れませんが、そんな自分も後々カスタマイズしやすいよう作っていますので、ウィジェットを自作してみたいって方は色々いじってみてください。