WordPress 人気のあるプラグイン WordPress Popular Postsから特定の記事を除外する

Last Updated: 2024 年 10 月 13 日 댓글

WordPress プラグイン WordPress Popular Postsを使用すると、ユーザーが頻繁に訪問する投稿のリストを表示できます。このプラグインでは、全体の視聴回数、毎日の平均視聴回数、またはコメント数に基づいて人気のある投稿を表示できます。

このプラグインを使用して人気の投稿を表示する場合は、特定の記事を除外したい場合があります。この記事では WordPress Popular Postsを使用した人気の投稿リストから特定の投稿を除外する方法を見てみましょう。

WordPress 人気のあるプラグイン WordPress 人気の投稿

WordPress サイトにユーザーが頻繁に訪れる人気の投稿を表示したいですか?そのような場合は、まずテーマがこの機能を提供しているかどうかを確認できます。例えば、 Newspaper テーマの場合、人気の投稿を表示する機能を提供します。

しかし、ほとんどのテーマではこの機能を提供していないため WordPress 人気の投稿という WordPress プラグインを使用することができます。

WordPress 人気のあるプラグイン WordPress 人気の投稿

このプラグインは2024年10月現在、20万を超えるサイトにインストールされ使用されており、 WordPress 5.7バージョン以上とPHP 7.2バージョン以上で動作します。

この無料のプラグインをインストールして有効にすると、ウィジェットやショートコードで人気のあるリストを好きな場所に表示できます。

ブロックエディタ(ブロックエディタ)を使用する場合の外観 » ウィジェットから WordPress 人気の投稿 ウィジェットを選択できます。

ウィジェットを追加すると、表示する投稿の数、並べ替え基準、時間範囲(過去24時間、過去7日、過去30日、合計時間、カスタマイズ)、投稿の種類など、さまざまなパラメータを指定できます。

ウィジェットが利用できない環境(クラシックエディタなど)では、[wpp]ショートコードを使用して人気のある記事のリストを表示できます。パラメータなしで[wpp]を使用すると、最も頻繁に表示される投稿が最大10件までリストされます。

記事の数を変更したり、視聴回数などを隠したり表示したい場合は、このプラグインのマニュアルを参照してショートコードを作成できます。

たとえば、過去7日間で最も多くのヒットを記録したトップ5の記事を表示したい場合は、次のショートコードを使用できます。

[wpp range='last7days' limit=5 stats_views=1 order_by='views']

過去30日間で最もコメントの多い投稿トップ10を表示するには、次のショートコードを使用できます。

[wpp range='last30days' stats_comments=1 order_by='comments']

詳細については、 WordPress Popular Posts 公式ドキュメントを参照してください。

WordPress Popular Postsから特定の記事を除外する方法

特定のカテゴリの投稿のみを表示したい場合、または特定の記事を除外したい場合は、このプラグインが提供するフィルタを使用できます。

たとえば、特定のカテゴリの投稿だけが人気のある記事のリストに表示したい場合は、次のコードをテーマの関数ファイルに追加します。 (チャイルドテーマを作成して作業してください。)

function wpp_display_only_one_category($terms) {
    return array_slice($terms, 0, 1);
}
add_filter('wpp_post_terms', 'wpp_display_only_one_category', 10, 1);

詳しくは、このプラグインのマニュアルのwpp_post_termsフック部分を参照してください。

コードを子テーマ関数ファイルに追加するには、FTPにアクセスできる必要があります。

特定の記事を除外したい場合は、このプラグインが提供するwpp_custom_htmlフィルタを使用できます。

次のコードをテーマの関数ファイルに追加すると、 WordPress 管理者ページに除外する投稿のIDを入力して除外できます。

// 1. 관리자 설정 메뉴 추가
function wpp_exclude_posts_menu() {
	add_options_page(
		'Exclude Popular Posts', // 페이지 제목
		'Exclude Popular Posts', // 메뉴 제목
		'manage_options',        // 권한
		'exclude-popular-posts',  // 페이지 슬러그
		'wpp_exclude_posts_page'  // 콜백 함수 (페이지 표시)
	);
}
add_action('admin_menu', 'wpp_exclude_posts_menu');

// 2. 설정 페이지 HTML 출력
function wpp_exclude_posts_page() {
	?>
	<div class="wrap">
		<h1>Exclude Popular Posts</h1>
		<form method="post" action="options.php">
			<?php
			// 설정 필드 및 섹션 표시
			settings_fields('wpp_exclude_posts_group'); // 그룹 이름 확인
			do_settings_sections('exclude-popular-posts'); // 페이지 슬러그와 일치해야 함
			submit_button();
			?>
		</form>
	</div>
	<?php
}

// 3. 설정 초기화 및 필드 등록
function wpp_exclude_posts_settings() {
	// 설정 등록
	register_setting(
		'wpp_exclude_posts_group', // 설정 그룹
		'wpp_exclude_post_ids'     // 설정 옵션 이름
	);
	
	// 섹션 추가
	add_settings_section(
		'wpp_exclude_posts_section',  // 섹션 ID
		'Exclude Post IDs',           // 섹션 제목
		null,                         // 콜백 함수 (필요하지 않음)
		'exclude-popular-posts'        // 페이지 슬러그
	);
	
	// 설정 필드 추가
	add_settings_field(
		'wpp_exclude_post_ids_field', // 필드 ID
		'Post IDs to Exclude (comma separated)', // 필드 라벨
		'wpp_exclude_post_ids_field_callback',   // 콜백 함수 (필드 표시)
		'exclude-popular-posts',                 // 페이지 슬러그
		'wpp_exclude_posts_section'              // 섹션 ID
	);
}
add_action('admin_init', 'wpp_exclude_posts_settings');

// 4. 입력 필드 콜백
function wpp_exclude_post_ids_field_callback() {
	// 옵션 값 가져오기
	$exclude_post_ids = get_option('wpp_exclude_post_ids');
	// 입력 필드 출력
	echo '<input type="text" name="wpp_exclude_post_ids" value="' . esc_attr($exclude_post_ids) . '" class="regular-text">';
}

// 5. 인기 글 목록에서 제외할 글 ID 처리
function my_custom_popular_posts_html_list($popular_posts, $instance) {
	$excluded_posts_option = get_option('wpp_exclude_post_ids');
	$excluded_posts = !empty($excluded_posts_option) ? array_map('intval', explode(',', $excluded_posts_option)) : [];
	
	$output = '<ol class="wpp-list">';
	$displayed_posts = 0;
	$total_to_display = intval($instance['limit']); // 지정된 글 수를 정수로 처리
	$index = 0;
	
	while ($displayed_posts < $total_to_display && isset($popular_posts[$index])) {
		$popular_post = $popular_posts[$index];
		$index++;
		
		// 제외된 글인지 확인
		if (in_array(intval($popular_post->id), $excluded_posts)) {
			continue;
		}

		$stats = array();

		// 댓글 수 표시
		if ( $instance['stats_tag']['comment_count'] ) {
			$stats[] = '<span class="wpp-comments">' . sprintf(
				_n('1 comment', '%s comments', intval($popular_post->comment_count), 'wordpress-popular-posts'),
				number_format_i18n(intval($popular_post->comment_count))
			) . '</span>';
		}

		// 조회 수 표시
		if ( $instance['stats_tag']['views'] ) {
			if ($instance['order_by'] == 'avg') {
				$stats[] = '<span class="wpp-views">' . sprintf(
					_n('1 view per day', '%s views per day', intval($popular_post->pageviews), 'wordpress-popular-posts'),
					number_format_i18n(intval($popular_post->pageviews), 2)
				) . '</span>';
			} else {
				$stats[] = '<span class="wpp-views">' . sprintf(
					_n('1 view', '%s views', intval($popular_post->pageviews), 'wordpress-popular-posts'),
					number_format_i18n(intval($popular_post->pageviews))
				) . '</span>';
			}
		}

		// 작성자 정보 표시
		if ( $instance['stats_tag']['author'] ) {
			$author = esc_html(get_the_author_meta('display_name', intval($popular_post->uid)));
			$display_name = '<a href="' . esc_url(get_author_posts_url(intval($popular_post->uid))) . '">' . $author . '</a>';
			$stats[] = '<span class="wpp-author">' . sprintf(__('by %s', 'wordpress-popular-posts'), $display_name). '</span>';
		}

		// 날짜 표시
		if ( $instance['stats_tag']['date']['active'] ) {
			$date = date_i18n(esc_attr($instance['stats_tag']['date']['format']), strtotime($popular_post->date));
			$stats[] = '<span class="wpp-date">' . sprintf(__('posted on %s', 'wordpress-popular-posts'), $date) . '</span>';
		}

		// 카테고리 표시
		if ( $instance['stats_tag']['category'] ) {
			$post_cat = get_the_category(intval($popular_post->id));
			$post_cat = ( isset($post_cat[0]) )
			  ? '<a href="' . esc_url(get_category_link($post_cat[0]->term_id)) . '">' . esc_html($post_cat[0]->cat_name) . '</a>'
			  : '';
			if ( $post_cat != '' ) {
				$stats[] = '<span class="wpp-category">' . sprintf(__('under %s', 'wordpress-popular-posts'), $post_cat) . '</span>';
			}
		}

		// 통계 출력
		if ( ! empty($stats) ) {
			$stats = '<div class="wpp-stats">' . join(' | ', $stats) . '</div>';
		} else {
			$stats = null;
		}

		// 발췌문 표시
		$excerpt = '';
		if ( $instance['post-excerpt']['active'] ) {
			$excerpt = get_excerpt_by_id(intval($popular_post->id));
			if ( ! empty($excerpt) ) {
				$excerpt = '<div class="wpp-excerpt">' . esc_html($excerpt) . '</div>';
			}
		}
		
		// 출력에 추가
		$output .= "<li>";
		$output .= "<p class=\"entry-title\"><a href=\"" . esc_url(get_permalink(intval($popular_post->id))) . "\" title=\"" . esc_attr($popular_post->title) . "\">" . esc_html($popular_post->title) . "</a></p>";
		$output .= $stats;
		$output .= $excerpt;
		$output .= "</li>" . "\n";
		
		$displayed_posts++;
	}

	// 부족한 게시물을 채우기 위해 추가로 포스트를 가져오는 로직
	if ($displayed_posts < $total_to_display) {
		$args = array(
			'posts_per_page' => $total_to_display - $displayed_posts,
			'post__not_in' => $excluded_posts,
			'orderby' => 'date',
			'order' => 'DESC',
			'post_type' => 'post', // 특정 포스트 타입을 명시하여 보안 강화
			'post_status' => 'publish' // 공개된 글만 가져옴으로써 비공개 글 제외
		);
		$additional_posts = get_posts($args);
		
		foreach ($additional_posts as $post) {
			$output .= "<li>";
			$output .= "<p class=\"entry-title\"><a href=\"" . esc_url(get_permalink($post->ID)) . "\" title=\"" . esc_attr($post->post_title) . "\">" . esc_html($post->post_title) . "</a></p>";
			$output .= "</li>" . "\n";
		}
	}
	
	$output .= '</ol>';
	return $output;
}
add_filter('wpp_custom_html', 'my_custom_popular_posts_html_list', 10, 2);

チャイルドテーマにコードを追加するのが難しい場合は、プラグインとして作成してインストールすることもできます。上記のコードを使用してプラグインを作成しました。コードが数行でないため、サイトの速度にはほとんど影響しません。次へ Naver カフェからダウンロードしてください。

上記のコードを追加するか、プラグインをインストールすると 設定 » Exclude Popular Postsから除外する投稿を投稿IDとして登録して除外できます。複数を入力する場合はカンマで区切ってください。

投稿ID(Post ID)を確認する方法については、下記の「投稿IDを確認する」を参照してください。

次の環境でうまくいきました。

他の環境でもうまく機能するようですが、エラーが発生した場合はこの記事や Naver カフェ記事でお知らせいただくと、コードを編集できる場合は修正させていただきます。

セキュリティの脆弱性も存在しないように対策を講じましたが、コードの改善が必要な場合は、コメントでお知らせいただきありがとうございます。

人気記事リストのスタイルは CSSを使用して必要に応じて変更できます。

サムネイル(特性画像)を表示したい場合

サムネイルを表示したい場合は、上記のコードからサムネイルを表示するコードを追加できます。例:

// 썸네일 표시
$thumbnail = get_the_post_thumbnail($popular_post->id, 'thumbnail'); // 'thumbnail'은 이미지 사이즈. 필요에 따라 'medium', 'large' 등으로 변경 가능

$output .= "<li>";
// 썸네일 추가
if ($thumbnail) {
	$output .= "<div class='wpp-thumbnail'>" . $thumbnail . "</div>";
}
$output .= "<p class=\"entry-title\"><a href=\"" . esc_url(get_permalink(intval($popular_post->id))) . "\" title=\"" . esc_attr($popular_post->title) . "\">" . esc_html($popular_post->title) . "</a></p>";
$output .= $stats;
$output .= $excerpt;
$output .= "</li>" . "\n";

上記のコードを適切に適用して追加してください。同様に、CSSを使用してレイアウトまたはスタイルを指定できます。

投稿IDを確認する

投稿ID(投稿ID)は、投稿リスト内の投稿の上にマウスを置くことで簡単にチェックできます。

WordPress 投稿IDを確認する

この方法が面倒な場合 Show Pages IDsのようなプラグインをインストールできますが、あえてこのためプラグインを追加でインストールする必要はないかと思います。

参照


コメントを残す

コメント