配色:                          文字サイズ: 

[WordPress]ウィジェット カテゴリ表示変更

WordPressウィジットのカテゴリ表示を、指定の区切り文字にする方法です。

デフォルトだとこのようなリスト表示になります。

まず初めに思いつく方法が、直接コードを書き換える方法
検索のキーワードになりそうな、文字列を探します。

“cat-item”が使えそうです。

% grep -r cat-item *
wp-includes/category-template.php:                              $output .= '<li class="cat-item-none">' . $show_option_none . '</li>';
wp-includes/category-template.php:                              $output .= "<li class='cat-item-all'><a href='$posts_page'>$show_option_all</a></li>";
wp-includes/class-walker-category.php:                          'cat-item',
wp-includes/class-walker-category.php:                          'cat-item-' . $category->term_id,
%

class-walker-category.php このファイルの中にありそうです。

この部分で生成していますね。

			$output .=  ' class="' . $css_classes . '"';
			$output .= ">$link\n";
		} elseif ( isset( $args['separator'] ) ) {
			$output .= "\t$link" . $args['separator'] . "\n";
		} else {
			$output .= "\t$link<br />\n";
		}

ここを書き換えれば変更できそうですが、WordPressのアップデートで上書きされる可能性があります。

$args[‘separator’] と設定項目あるので、Walker_Categoryクラスはこのまま使えそうです。
if ( ‘list’ == $args[‘style’] ) { ともあるので、$args[‘style’]をlist以外 “none”にする必要もありそうです

残念ながら、デフォルトのカテゴリ表示ウィジェットには、style & separatorの設定項目がなさそうです。
仕方がないので、新しいウィジットを作ることにします。

利用しているテーマ内のfunctions.phpに、下記コードを追加しました。
wp-includes/class-wp-widget-categories.php からコピーして必要部分を書き換えました。

class MY_Walker_Category extends WP_Widget{

	function __construct() {
			parent::__construct(
				'My_Walker_Category',
				'カテゴリ表示 改変版',
				array( 'description' => '改行なしカテゴリ表示', )
			);
		}

	public function widget( $args, $instance ) {
		static $first_dropdown = true;

		$title = ! empty( $instance['title'] ) ? $instance['title'] : __( 'Categories' );
		$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );

		$separator = ! empty( $instance['separator'] ) ? $instance['separator'] : "";

		$c = ! empty( $instance['count'] ) ? '1' : '0';
		$h = ! empty( $instance['hierarchical'] ) ? '1' : '0';


		if ( $title ) {
			echo $args['before_title'] . $title . $args['after_title'];
		}

		$cat_args = array(
			'orderby'      => 'count',
			'order'        => 'DESC',
			'show_count'   => $c,
			'hierarchical' => $h,
			'separator' => $separator,
			'style' => 'none',
			'echo'  => 0,
		);

		$cat_args['title_li'] = '';
		echo wp_list_categories( apply_filters( 'widget_categories_args', $cat_args, $instance ) );
	}

    public function form( $instance ){

		$instance = wp_parse_args( (array) $instance, array( 'title' => '') );
		$title = sanitize_text_field( $instance['title'] );

		$instance = wp_parse_args( (array) $instance, array( 'separator' => '') );
		$separator = sanitize_text_field( $instance['separator'] );

		$count = isset($instance['count']) ? (bool) $instance['count'] :false;
		$hierarchical = isset( $instance['hierarchical'] ) ? (bool) $instance['hierarchical'] : false;
		$dropdown = isset( $instance['dropdown'] ) ? (bool) $instance['dropdown'] : false;
		?>
		<p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e( 'Title:' ); ?></label>
		<input class="widefat" id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" /></p>

		<p><label for="<?php echo $this->get_field_id('separator'); ?>"><?php _e( 'separator:' ); ?></label>
		<input class="widefat" id="<?php echo $this->get_field_id('separator'); ?>" name="<?php echo $this->get_field_name('separator'); ?>" type="text" value="<?php echo esc_attr( $separator ); ?>" /></p>

		<input type="checkbox" class="checkbox" id="<?php echo $this->get_field_id('count'); ?>" name="<?php echo $this->get_field_name('count'); ?>"<?php checked( $count ); ?> />
		<label for="<?php echo $this->get_field_id('count'); ?>"><?php _e( 'Show post counts' ); ?></label><br />

		<input type="checkbox" class="checkbox" id="<?php echo $this->get_field_id('hierarchical'); ?>" name="<?php echo $this->get_field_name('hierarchical'); ?>"<?php checked( $hierarchical ); ?> />
		<label for="<?php echo $this->get_field_id('hierarchical'); ?>"><?php _e( 'Show hierarchy' ); ?></label></p>
		<?php
    }

    function update($new_instance, $old_instance) {
		$instance = $old_instance;
		$instance['title'] = sanitize_text_field( $new_instance['title'] );
		$instance['separator'] = sanitize_text_field( $new_instance['separator'] );
		$instance['count'] = !empty($new_instance['count']) ? 1 : 0;
		$instance['hierarchical'] = !empty($new_instance['hierarchical']) ? 1 : 0;

		return $instance;
    }

}


add_action( 'widgets_init', function () {
	register_widget( 'MY_Walker_Category' ); 
} );

外観のウィジェット一覧に出てきました。
セパレータの入力もできました。

表示も問題ありませんでした。

時間があれば、別記事でコードの説明をします。
以上

以前は、よく使ってました。定番ソフトの一つです。