이전 글에서 루프에서 특정 카테고리의 글만 표시하거나 제외하는 방법을 살펴보았습니다. 메인 페이지에서 특정 카테고리의 글만 제외시키려면 어떻게 하면 될까요? 이 경우 'pre_get_posts' 액션을 사용하면 쉽게 워드프레스 블로그의 첫 페이지에서 특정 카테고리의 글만 제외시킬 수 있습니다.
워드프레스 메인 페이지(전면 페이지)에서 특정 카테고리 글 제외하기
전면 페이지에 특정 카테고리의 글들을 표시하지 싶지 않은 경우 다음과 같은 코드를 사용할 수 있습니다.
function exclude_category( $query ) { if ( $query->is_home() && $query->is_main_query() ) { $query->set( 'cat', '-1,-2' ); } } add_action( 'pre_get_posts', 'exclude_category' );
참고로 특정 카테고리의 글만 표시하려면 테마 소스 파일에서 다음 라인을 추가해주면 됩니다.
<?php query_posts("showposts=5&cat=1"); ?>
pre_get_posts 액션은 query variable object가 생성된 후, 그리고 실제 query가 실행되기 전에 호출됩니다. 그러므로 이 액션을 사용하면 표시하거나 제외할 글을 쉽게 제어할 수 있습니다. 가령 다음과 같은 함수를 사용하여 특정 특정 카테고리의 표시 순서를 변경할 수 있습니다. (아래의 경우 카테고리의 글을 알파벳순으로 정렬합니다.)
function wpsf_orderby( $query ) { if ( is_admin() || ! $query->is_main_query() ) return; // do conditional checks here and return on false.? if ( is_category('uncategorized') ) { remove_action( 'pre_get_posts', __FUNCTION__ ); add_filter( 'posts_orderby', function() { return ' post_title ASC'; } ); } } add_action( 'pre_get_posts', 'wpsf_orderby' ); // Source: wordpress.org
위의 코드는 사용 중인 테마의 함수 파일(functions.php)에 추가하도록 합니다. 테마가 업데이트되어도 코드가 사라지지 않도록 하려면 차일드 테마 (자식 테마)를 만들어 작업하시기 바랍니다. 이 작업을 위해서는 FTP에 접속할 수 있어야 합니다. FTP 사용법은 여기를 클릭하여 참고해보세요.
플러그인 사용하기
위의 방법이 어렵다면 플러그인을 사용하는 방법도 가능합니다.
Ultimate Category Excluder(UCE) 플러그인을 사용하면 프런트 페이지, 아카이브, 피드 및 검색에서 특정 카테고리를 쉽고 빠르게 제외시킬 수 있습니다. 제외할 카테고리를 선택하기면 하면 UCE 플러그인이 알아서 처리해주므로 매우 편리합니다.
하지만 플러그인을 많이 설치하면 사이트 속도에 영향을 미칠 수 있고, 경우에 따라 다른 플러그인이나 테마와 충돌을 일으킬 수 있으므로 가능한 경우 플러그인 사용을 최소화하는 것이 바람직합니다.
특정 카테고리만 전면 페이지/홈페이지에 표시하도록 하려면 마이너스 기호를 삭제하여 카테고리 ID를 추가하면 됩니다.
카테고리 ID를 확인하는 방법은 https://www.thewordcracker.com/basic/how-to-check-post-page-and-category-id-in-wordpress/ 글을 참고하시기 바랍니다.
위에서 is_home()은 홈페이지(블로그 페이지)에 해당하고 전면 페이지(is_front_page())는 해당하지 않습니다. 전면 페이지까지 고려하려면 이론상 $query->is_home() 부분을 ($query->is_home() || $query->is_front_page())와 같이 바꾸어주면 될 것 같습니다. (이 글의 제목에서 "전면 페이지"란 표현이 빠져야 더 정확합니다.)