LQDB Liberty Questの技術メモサイト。

何かお探しですか?

検索結果を投稿タイプ別に絞り込めるウィジェット

コード

こちらのコードをfunctions.php等にコピペする事で、お使いのWordPressに検索結果をセレクトタグにより投稿タイプで絞り込む事が出来るウィジェットが追加されます。
特殊な検索フォームウィジェットを実装する際の雛形にもどうぞ。

ウィジェットのカスタマイズに関してはオリジナルのウィジェットを追加する方法もご覧下さい。

/**
 * 投稿タイプ別に検索結果を絞り込む事が出来る検索ウィジェットです。
 */
class postTypeSearchWidget extends WP_Widget {

	public function __construct() {
		parent::__construct( 'post-type-search-widget', '投稿タイプ別検索', array( 'description' => '投稿タイプ別に検索を行うフォームを提供します。' ) );
	}

	public function widget( $args, $instance ) {
		$posttypes = json_decode( $instance['posttypes'] );
		echo $args['before_widget'];
		if ( ! empty( $instance['title'] ) ) {
			echo $args['before_title'] . apply_filters( 'widget_title', $instance['title'] ). $args['after_title'];
		}
	
		echo '<form action="' . get_bloginfo('url') . '" method="get">';
		echo '<input type="text" id="s" name="s" value="' . esc_html( get_search_query() ) . '">';
		if( !empty( $posttypes ) ) {
			echo ' <select name="posttype">';
			foreach( $posttypes as $val ) {
				$posttype = get_post_type_object( $val );
				echo '<option value="' . $val . '">' . $posttype->labels->name . '</option>';
			}
			echo '</select> ';
		}
		echo '<input type="submit" id="searchsubmit" value="検索">';
		echo '</form>';
		
		echo $args['after_widget'];
	}

	public function form( $instance ) {

		$title     = ! empty( $instance['title'] ) ? $instance['title'] : '';
		$posttype = json_decode( $instance['posttypes'] );

		echo '<p>';
		echo '<label for="' . $this->get_field_id('title') . '">タイトル:</label>';
		echo '<input class="widefat" id="' . $this->get_field_id('title') . '" name="' . $this->get_field_name('title') . '" value="' . esc_html( $title ) . '" type="text">';
		echo '</p>';

		$posttypes = get_post_types( array(), 'objects' );
		if( !empty( $posttypes ) ) {
			echo '<ul>';
			foreach( $posttypes as $val ) {
				if( is_array( $posttype ) and in_array( $val->name, $posttype ) ) {
					$checked = ' checked="checked"';
				}
				else {
					$checked = '';
				}
				echo '<li>';
				echo '<input type="checkbox" id="widget-post-type-search-widget-posttype-' . $val->name . '" name="' . $this->get_field_name('posttypes') . '[]" value="' . $val->name . '"' . $checked . '> <label for="widget-post-type-search-widget-posttype-' . $val->name . '">' . $val->labels->name . '</label>';
				echo '</li>';
			}
			echo '</ul>';
		}

	}

	public function update( $new_instance, $old_instance ) {
		$instance = array();
		$instance['title'] = ( ! empty( $new_instance['title'] ) ) ? strip_tags( $new_instance['title'] ) : '';
		$instance['posttypes'] = json_encode( $new_instance['posttypes'] );
		return $instance;
	}
}

// ウィジェットを登録します。
add_action( 'widgets_init', function(){
  register_widget( 'postTypeSearchWidget' );
});

(20) Comments

コメントを残す

コメント内容の項目は必須入力です。
コメントは承認後に公開されますので反映に時間がかかる場合がございます。また、メールアドレスは公開されません。

返信先: