인프런 커뮤니티 질문&답변

lkjrewq님의 프로필 이미지
lkjrewq

작성한 질문수

워드프레스 제대로 개발하기 - 클라이언트 편

query loop 관련 커스터마이징 질문

작성

·

172

0

안녕하세요 필요한 부분이 있어서 뒷부분을 먼저 듣다가 질문하게 되었습니다.

섹션 8 인텍스 화면 기본 강의에서 WP Query 사용방법이 나오는데요.

제가 구현하고자하는건 사용자의 등급에 따라 어떤 post는 나타나고 안나타나는 기능을 구현하고 싶습니다. ( ex - 실버등급 유저는 카테고리 골드의 포스트가 나오면 안됨)

해당강의에서는 index.php에 바로 구현을 하시던데, 저는 지금 아쉽게도 제가 만든 테마가 아니고 Avada를 이용하고 있습니다.

간단하게 function.php에 루프를 적용해봤더니 제대로 동작하지를 않더라구요.

그래서 이것저것시도하다 안되어 시도하면서 궁금해진 것과 방법을 질문드리고자합니다.

1. function.php에 add_filter('pre_get_posts', 'show_post_byuserlevel'); 이런식으로 했는데 pre_get_posts에는 걸면 안되는 걸까요? (show post byuserlevel 함수내에서 var dump를 찍어보니 상당히 여러군데에서 호출되는것같습니다. 함수내에서 유저의 등급을 확인하는 로직을 빼면 post를 빼는 로직이 동작하지만, 등급관련 로직을 넣으면 post를 빼는 로직이 동작하지 않아 그런것으로 보입니다, ex-if(현재유저가 실버등급) {골드포스트는 빼는 루프}

2. function.php가 아니고 다른곳에 구현을 해야할까요? 강의로 볼때는 add_filter나 add_action을 사용하지 않으셔서 적절한 파일에 query 루프만 구현하면 되는지 궁금합니다.

3. 다른곳에 구현해야한다면 어느파일이 좋을까요? 강의상에는 index.php에 루프를 구현하면 메인화면에만 루프가 영향을 미치는 것처럼 보입니다.  제 사이트도 여러 페이지가 존재해서 각 페이지별 보여줘야하는 포스트가 존재해 페이지별로 루프를 일일히 구현해야하는지, 아니면 어느 php 파일내에 한번 루프를 구현하면 모든페이지에 영향을 줄수있는 .php 파일이 있는지 궁금합니다. (아마 part1 강의에서 워드프레스구조를 알려주셨던거같은데, 이렇게 질문하는게 맞는지 조금 확신이 잘 안 서네요)

질문이 장황합니다만 이해가 안되시는 부분있으시면 추가 설명 하겠습니다.

쿠폰도 감사하고 part1때보다 편집도 훨씬 잘되있는것같아 좋습니다.

답변 1

0

워드프레스 개발님의 프로필 이미지
워드프레스 개발
지식공유자

lkjrewq님 안녕하세요. 흥미로운 질문 감사합니다.

말씀하신 부분은 functions.php에서 pre_get_posts 필터에 훅을 걸어 처리하는 게 맞습니다. 적절하게 고르신 것 같아요.

pre_get_posts 필터에 걸린 함수는 WP_Query 객체를 첫 번째 파라미터로 받게 됩니다. 여기에서 상황에 따라 적절한 조건을 추가해 주면 나오는 글의 종류가 달라지게 됩니다.

다만, 주의하실 점이 있는데요. WP_Query 객체의 set 메서드를 이용해서 조건을 추가해 주셔야 한다는 점입니다. 예컨대 특정 권한을 가진 사람에게는 특정 게시판만 보여 주려면 set 메서드를 통해 tax_query를 추가해 주면 되는 것이죠.

아래는 제가 실제 프로젝트에서 사용한 코드입니다. 마침 말씀하신 대로 권한이 있는 게시판의 포스트만 보여 주는 기능을 구현한 것입니다. 아래 코드에서 마지막 부분을 보시면 tax_query를 세팅하는 것을 보실 수 있습니다.

추가로 궁금하신 것이 있으면 질문해 주세요.

감사합니다.

add_filter( 'pre_get_posts', 'onlyMyBoardPost' );

/**
 * 게시판별로 권한 관리를 하게 됐다면, 자기가 권한을 가진 게시판의 글만 봐야 한다.
 *
 * @param \WP_Query $wp_query_obj
 */
public function onlyMyBoardPost( \WP_Query $wp_query_obj ) {
    global $current_user, $pagenow;

    if ( ! $this->isBoardPostRequest( $wp_query_obj ) ) {
        return;
    }

    if ( ! is_a( $current_user, 'WP_User' ) ) {
        return;
    }

    if ( ! current_user_can( 'delete_pages' ) ) {
        // 관리자 권한이 없다면

        // 권한을 가진 게시판 + 전체 공개 게시판 + 회원 공개 게시판
        $boardSlugsCanRead = array_merge( array_map( function ( $term ) {
            return $term->slug;
        }, $this->getMyBoards() ), $this->publicBoardSlugs, $this->memberBoardSlugs );

        $wp_query_obj->set( 'tax_query', [
            [
                'taxonomy' => $this->taxonomyKey,
                'field'    => 'slug',
                'terms'    => $boardSlugsCanRead,
            ]
        ] );
    }
}
lkjrewq님의 프로필 이미지
lkjrewq
질문자

빠른답변 감사합니다. 적용해볼게요

아 그리고 혹시 이 코드도 function.php에 넣으면 되려나요?

워드프레스 개발님의 프로필 이미지
워드프레스 개발
지식공유자

네. 맞습니다. 

lkjrewq님의 프로필 이미지
lkjrewq

작성한 질문수

질문하기