inflearn logo
강의

講義

知識共有

WordPressを正しく開発する - クライアント

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

263

lkjrewq

投稿した質問数 1

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때보다 편집도 훨씬 잘되있는것같아 좋습니다.

wordpress php

回答 1

0

mytory

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,
            ]
        ] );
    }
}

0

lkjrewq

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

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

0

mytory

네. 맞습니다. 

뉴스페이퍼 싱글템플릿 디자인 관련 상담 요청

0

27

2

53강 레이아웃에서 css git 링크 관련 질문입니다.

0

35

2

폰트 업로드 단계에 설치해야할 플러그인이 현재 없습니다

0

49

2

FASTCOMET SSL 설정 방법 문의

0

54

2

banbu.kr 사이트 접속이 안됩니다.

0

56

2

엘리멘터

0

48

2

선생님 총체적 난국입니다..

0

73

2

wsl에서 폴더 열기 리눅스 드라이브가 보이지 않습니다.

0

66

1

도메인연결문의

0

56

2

도쿄서버 선택불가의 경우 대체 안을 알려주세요

0

56

2

강의가 오래됐는데 현시점에 원활한 진행이 가능할까요?

0

41

2

XML 불러오기 불가 (이미지만)

0

158

1

플러그인 개발에 대해서 궁금합니다

0

315

2

워드프레스 댓글 수정 삭제

0

377

2

single-book.php 파일은 워드프레스 기본 제공 파일인가요?

1

300

2

wp_enqueue_style 이동

0

292

2

강의변경

0

391

1

WP 전반적인 질문입니다.

0

447

1

xml 가져오기 불가

0

422

1

xdebug 3.2와 PHPStorm debug 연동

0

774

1

phpStorm에서 Cmd B 정의로 바로 점프하는게 안되요

0

242

1

wp_reset_postdata();

0

344

1

어드민 강의 관련

0

385

1

안녕하세요 첫 질문입니다

0

277

4