[section] portfolio – 3B

이제 포트폴리오 부분이 거의 정리 되었습니다.
이번 주제는 ajax에 관련된 내용으로 비동기로 서버에서 다음 페이지의 내용을 가져와 화면의 원하는 영역에 추가 하는 작업을 같이 진행하겠습니다.

ajax를 사용하는 이유

  • 비동기로 서버와 통신
  • 원하는 영역만 로딩이 가능
functions.php
    // custom
    wp_enqueue_script( 'zeein-custom.js', get_stylesheet_directory_uri() . '/assets/js/custom.js', array(), 'v1.0', true );
    wp_localize_script( 'zeein-custom.js', 'frontend_ajax_object', 
        array(
            'ajaxurl' => admin_url( 'admin-ajax.php' )
        )
    );

63-66: fronfend_ajax_object.ajaxurl 에 admin-ajax.php 의 url을 저장하고 zeein-custom.js 핸들러 에서 사용할수 있도록 합니다.

// load_portfolio_by_ajax
add_action( 'wp_ajax_nopriv_load_portfolio_by_ajax', 'load_portfolio_by_ajax' );
add_action( 'wp_ajax_load_portfolio_by_ajax', 'load_portfolio_by_ajax' );

if ( !function_exists('load_portfolio_by_ajax') ) {
	function load_portfolio_by_ajax() {
        
        check_ajax_referer( 'load_more_portfolio', 'security' );

        $args = array(
            'post_type'         => 'portfolio',
            'orderby'           => 'date',
            'order'             => 'DESC',
            'posts_per_page'    => 6,
            'post_status'       => 'publish',
            'paged'             => $_POST['paged'],
        );

        $posts = new WP_Query( $args );
        $GLOBALS['wp_query'] = $posts;
    
        if( ! $posts->have_posts() ) {
            get_template_part( 'template-parts/content', 'none' );		
        } else {
            while ( $posts->have_posts() ) { 
                $posts->the_post();
                get_template_part( 'template-parts/content', 'portfolio' );
            }
        }
        die();
	}
}

79: wp_ajax_(action) : 로그인한 사용자에게 실행되는 ajax
80: wp_ajax_nopriv_(action) : 로그인하지 않은 사용자에게 사용하는 ajax
85: ajax 요청을 검증하며 다른 사이트나 시스템에서 전달 된 요청을 처리하지 못하도록 하는 역할을 합니다.

보통 로그인과 상관없이 노출하기 때문에 (action)명은 동일한 action명을 사용합니다.
나머지 부분은 index.php 의 내용과 거의 유사한 형태입니다.

custom.php
    // load more
    var defaultPageNum = 2;
    $('#btn-load-more').on('click', function(e){
        var $content = $('.ajax-portfolio');
        var $loader = $('#btn-load-more');
        var security = $loader.data('security');
        var sendData = {
            action: 'load_portfolio_by_ajax',
            query_vars: frontend_ajax_object.query_vars,
            paged: defaultPageNum,
            security : security,
        }
        $.ajax({
            type: 'post',
            url: frontend_ajax_object.ajaxurl,
            data: sendData,
            beforeSend: function() {
               $loader.html('LOADING PORTFOLIO..');
            },
            success: function(data) {
                var $data = $(data);
                if ($data.length) {
                    var $newElements = $data.css({opacity: 0});
                    $grid.append($newElements).imagesLoaded(function() {
                        $grid.masonry('appended', $data, true);
                    });
                    $newElements.animate({opacity: 1});
                    initMagnific();
                    $loader.html('VIEW MORE PORTFOLIO');
                } else {
                    $loader.html('NO MORE PORTFOLIO');
                }
                defaultPageNum++;
            },
            error : function (jqXHR, textStatus, errorThrown) {
				$loader.html($.parseJSON(jqXHR.responseText) + ' :: ' + textStatus + ' :: ' + errorThrown);
                console.log(jqXHR);
            }
        });
        return false;
    });

80: 기본적으로 한페이지(posts_per_page => 6)의 내용이 화면에 출력되고 있으므로 이후 2번째 페이지 부터 시작해야 하기 때문에 시작 숫자를 2로 시작을 하고 ajax 처리 이후에 111 라인에서 처럼 다음 페이지를 로딩하도록 +1씩 증가 시킵니다.
81: 아이디 #btn-load-more 를 클릭할때 진행하도록 선언합니다.
91: 서버와 비동기식 통신을 시작하는데
95: 시작하기 전에 $loader의 html 을 ‘LOADING PORTFOLIO..’로 변경하고
98: 통신이 성공하고
100: 화면에 노출할 데이터가 있으면 추가해 주고 masonry와 popup 관련 magnific을 초기화 해주고
108: 데이터가 없으면 $loder의 html 을 ‘NO MORE PORTFOLIO”로 변경
111: 다음에 읽을 페이지의 포인트를 +1 해서 저장
113: 통신에 실패할 경우 에러 화면을 출력


축하합니다! 여기까지 진행이 되었고 정상적인 작동을 한다면 zeein-yellow 테마의 핵심 기능은 거의 마스터 하셨습니다.

Share this

Leave your question or feedback

따뜻한 말한마디가 블로거를 춤추게 합니다. 이메일 주소는 공개되지 않습니다.