ワードプレスを触っていて、更新をするのがクライアントの場合、できる限り簡単にできるのが望ましいのですが、汎用のプラグインは必ずしも「私の顧客ニーズ」に合わない部分があり、悩ましいことが多いです。というわけで、日々更新をかけるようなWEB読み物媒体に利用するウィジェットを作成してみました。
利用条件
- カスタム投稿タイプをテキスト入力から取得
- 表示件数は1・5・10・15・20・ALLから選択
- 表示順はランダム・昇順・降順・最近記事・更新順・メニューオーダーから選択
- タイトルの長さは整数で指定
表示内容
- 先頭にウィジェットのタイトルを表示
- 10件目まではサムネイル・タイトル・タグ・抜粋
- 11件目以降はタイトル・タグのみ
11件目以降の表示方法を変える、というのはあまり使わなそうな機能ですが、要望だったので付け加えてあります。不要な場合は、カウントでIF分岐している箇所をざっくり削除してしまえば良いです。
コード
無駄なコードもありそうなんですが・・・カスタム投稿を指定している箇所(iricode_posttypeの箇所)を、カテゴリーを選択する形に変更するほうが一般的かもですね。
<?php
/*
Plugin Name: PostType Widget
*/
// Additing Action hook widgets_init
add_action('widgets_init', 'iricode_dailyNews_widget');
function iricode_dailyNews_widget() {
register_widget('iricode_dailyNews_widget_info');
}
class iricode_dailyNews_widget_info extends WP_Widget {
function __construct() {
$widget_ops = array( 'classname' => 'iricode_dailyNews_widget_info', 'description' => 'Select the category to display' );
parent::__construct( 'iricode_dailyNews_widget_info', 'IRI dailyNews Widget', $widget_ops );
}
public function form($instance) {
if (isset($instance['iricode_no_post']) && isset($instance['iricode_posttype']) && isset($instance['iricode_name']) && isset($instance['iricode_bullet']) && isset($instance['iricode_title_count']) && isset($instance['iricode_combo_list']) && isset($instance['iricode_please_select']) && isset($instance['iricode_orderby']) ) {
$iricode_no_post_value = $instance['iricode_no_post'];
$iricode_posttype_value = $instance['iricode_posttype'];
$iricode_name_value = $instance['iricode_name'];
$iricode_bullet_value = $instance['iricode_bullet'];
$iricode_title_count_value = $instance['iricode_title_count'];
$iricode_combo_list_value = $instance['iricode_combo_list'];
$iricode_please_select_value = $instance['iricode_please_select'];
$iricode_orderby_value = $instance['iricode_orderby'];
} else {//Setting Default Values
$iricode_no_post_value = 5;
$iricode_posttype_value = 'post';
$iricode_name_value = '';
$iricode_bullet_value = 2;
$iricode_title_count_value = 20;
$iricode_combo_list_value = 1;
$iricode_orderby_value = 4;
$iricode_please_select_value = 'Please Select';
}
?><!-- buffercode Category Widget Options -->
<p>タイトル: <input class="widefat" name="<?php echo $this->get_field_name('iricode_name'); ?>" type="text" value="<?php echo esc_attr($iricode_name_value); ?>" /></p>
<p>ポストタイプ: <input class="widefat" name="<?php echo $this->get_field_name('iricode_posttype'); ?>" type="text" value="<?php echo esc_attr($iricode_posttype_value); ?>" /></p>
<p>表示数:
<select name="<?php echo $this->get_field_name('iricode_no_post'); ?>" id="<?php echo $this->get_field_id('iricode_no_post'); ?>" class="widefat">
<?php
$options = array('1' => '1', '5' => '5', '10' => '10', '15' => '15', '20' => '20', 'All' => '11');
foreach ($options as $langu => $code) {
echo '<option value="' . $code . '" id="' . $code . '"', $iricode_no_post_value == $code ? ' selected="selected"' : '', '>', $langu, '</option>';
}
?>
</select></p>
<p>表示順:
<select name="<?php echo $this->get_field_name('iricode_orderby'); ?>" id="<?php echo $this->get_field_id('iricode_orderby'); ?>" class="widefat">
<?php
$orderby_options = array('Random' => '1', 'Ascending' => '2', 'Descending' => '3', 'Recent Post' => '4', 'Post Modified' => '5','Menun Order' => '6');
foreach ($orderby_options as $orderby_value => $orderby_code) {
echo '<option value="' . $orderby_code . '" id="' . $orderby_code . '"', $iricode_orderby_value == $orderby_code ? ' selected="selected"' : '', '>', $orderby_value, '</option>';
}
?>
</select></p>
<p>タイトル長さ:<input class="widefat" name="<?php echo $this->get_field_name('iricode_title_count'); ?>" type="text" value="<?php echo esc_attr($iricode_title_count_value); ?>" /></p>
<?php
}
function update($new_instance, $old_instance) {
$instance = $old_instance;
$instance['iricode_no_post'] = (!empty($new_instance['iricode_no_post']) ) ? strip_tags($new_instance['iricode_no_post']) : '';
$instance['iricode_posttype'] = (!empty($new_instance['iricode_posttype']) ) ? strip_tags($new_instance['iricode_posttype']) : '';
$instance['iricode_name'] = (!empty($new_instance['iricode_name']) ) ? strip_tags($new_instance['iricode_name']) : '';
$instance['iricode_bullet'] = (!empty($new_instance['iricode_bullet']) ) ? strip_tags($new_instance['iricode_bullet']) : '';
$instance['iricode_title_count'] = (!empty($new_instance['iricode_title_count']) ) ? strip_tags($new_instance['iricode_title_count']) : '';
$instance['iricode_combo_list'] = (!empty($new_instance['iricode_combo_list']) ) ? strip_tags($new_instance['iricode_combo_list']) : '';
$instance['iricode_orderby'] = (!empty($new_instance['iricode_orderby']) ) ? strip_tags($new_instance['iricode_orderby']) : '';
$instance['iricode_please_select'] = (!empty($new_instance['iricode_please_select']) ) ? strip_tags($new_instance['iricode_please_select']) : '';
return $instance;
}
function widget($args, $instance) {
extract($args);
echo $before_widget;
$iricode_name_value = apply_filters('widget_title', $instance['iricode_name']);
$iricode_posttype_value = empty($instance['iricode_posttype']) ? ' ' :
$instance['iricode_posttype'];
$iricode_no_post_value = empty($instance['iricode_no_post']) ? ' ' :
$instance['iricode_no_post'];
$iricode_bullet_value = empty($instance['iricode_bullet']) ? ' ' :
$instance['iricode_bullet'];
$iricode_title_count_value = empty($instance['iricode_title_count']) ? ' ' :
$instance['iricode_title_count'];
$iricode_combo_list_value = empty($instance['iricode_combo_list']) ? ' ' :
$instance['iricode_please_select'];
$iricode_orderby_value = empty($instance['iricode_orderby']) ? ' ' :
$instance['iricode_orderby'];
if ($iricode_header_link_value == 1)
$iricode_header_link_t_f = '<a href="' . $iricode_cat_site_url . '/' . $category_id_str_replaced . '">' . $iricode_name_value . '</a>';
else
$iricode_header_link_t_f = $iricode_name_value;
if (!empty($name)) {
echo $before_title . $iricode_header_link_t_f . $after_title;
}
if ($iricode_no_post_value == 11) {
$iricode_no_post_values = -1;
} else {
$iricode_no_post_values = $iricode_no_post_value;
}
if ($iricode_orderby_value == 3) {
$args = array('post_type' => $iricode_posttype_value, 'posts_per_page' => $iricode_no_post_values, 'order' => 'DESC', 'orderby' => 'title');
} else if ($iricode_orderby_value == 2) {
$args = array('post_type' => $iricode_posttype_value, 'posts_per_page' => $iricode_no_post_values, 'order' => 'ASC', 'orderby' => 'title');
} else if ($iricode_orderby_value == 1) {
$args = array('post_type' => $iricode_posttype_value, 'posts_per_page' => $iricode_no_post_values, 'orderby' => 'rand');
} else if ($iricode_orderby_value == 5) {
$args = array('post_type' => $iricode_posttype_value, 'posts_per_page' => $iricode_no_post_values, 'orderby' => 'modified');
} else if ($iricode_orderby_value == 6) {
$args = array('post_type' => $iricode_posttype_value, 'posts_per_page' => $iricode_no_post_values, 'orderby' => 'menu_order');
} else {
$args = array('post_type' => $iricode_posttype_value, 'posts_per_page' => $iricode_no_post_values, 'orderby' => 'ID');
}
$myposts = get_posts($args);
global $post;
echo ' ';
foreach ($myposts as $post) : setup_postdata($post);$loopcount++;
?>
<?php if ($loopcount <= 10): ?>
<article class="mb10">
<div class="row" <?php if ($iricode_bullet_value == 2) { ?><?php } ?>>
<div class="columns medium-2 small-4"><!-- buffercode Category Link Start -->
<figure><a href="<?php the_permalink(); ?>"><?php if(get_field('newmark')): ?><span class="label">new</span><?php endif; ?>
<?php
$post_thumbnail_id = get_post_thumbnail_id( get_the_ID() );
$image = wp_get_attachment_image_src( $post_thumbnail_id, 'normal' );
$title = get_the_title($post);
if ( $image ) {
list($src, $width, $height) = $image;
echo '<img src="' . esc_attr( $src ) .'" alt="'.$title.'">';
} else {
echo '<img src="'.get_bloginfo('template_directory').'/img/thumbnail_normal.png" alt="'.$title.'">';
}
?> </a></figure>
</div>
<div class="columns medium-10 small-8">
<h5 class="entry-title"><?php $posttags = get_the_tags();
if ($posttags) {
foreach($posttags as $tag) {
echo '<span class="label">'.$tag->name . ' </span>';
}
}
?> <a href="<?php the_permalink(); ?>"><?php
$check_title = get_the_title();
$title_count = strlen($check_title);
if ($title_count > $iricode_title_count_value) {
$substr_title = mb_substr($check_title, 0, $iricode_title_count_value);
echo $substr_title . '';
} else {
echo $check_title;
}
?></a></h5>
<p class="small"><?php echo mb_substr( get_the_excerpt(), 0, 70 ) . '[...]'; ?><p>
</div>
</div>
</article>
<?php else: ?>
<h5 class="entry-title mb10"><a href="<?php the_permalink(); ?>"><?php
$check_title = get_the_title();
$title_count = strlen($check_title);
if ($title_count > $iricode_title_count_value) {
$substr_title = mb_substr($check_title, 0, $iricode_title_count_value);
echo $substr_title . '';
} else {
echo $check_title;
}
?></a> <?php $posttags = get_the_tags();
if ($posttags) {
foreach($posttags as $tag) {
echo '<span class="label">'.$tag->name . ' </span>';
}
}
?></h5>
<?php endif; ?>
<?php endforeach;
echo '';
wp_reset_postdata();
echo $after_widget;
}
}
?>
カテゴリー選択式の場合
iricode_posttypeをiricode_categoryに変更して、ポストタイプの箇所を書き換える感じです。
<p>カテゴリー選択: <?php wp_dropdown_categories(array('name' => $this->get_field_name('iricode_category'), 'selected' => $iricode_category_value, 'id' => $this->get_field_id('iricode_category'), 'class' => 'widefat')); ?> </p>