웹사이트 검색

WooCommerce 최근 본 제품 단축 코드


며칠 전 WooThemes 팀은 모든 단일 WordPress 웹사이트에서 모든 종류의 제품을 매우 쉽게 판매할 수 있게 해주는 매우 인기 있는 WooCommerce 플러그인 버전 2를 발표했습니다. 비록 제가 매우 재능 있는 Pippin Williamson이 만든 멋진 Easy Digital Downloads 플러그인을 사용하는 데 더 익숙하더라도 WooCommerce에 대해 좀 더 자세히 알아보고 기존 기능을 사용하여 새로운 기능을 만드는 방법을 보여주고 싶었습니다. 그리고 오늘은 최근 본 상품을 표시하는 숏코드를 만드는 방법에 대해 설명드리고자 합니다. 최근 본 제품은 나에게 아주 기본적인 인공 지능이기 때문에 매우 강력한 기능입니다. 이를 통해 사용자는 단 몇 초 만에 이미 본 제품으로 쉽게 돌아갈 수 있습니다. 그리고 최근에 본 제품을 표시하기 위해 단축 코드를 사용한다는 사실은 웹사이트 어디든 배치할 수 있다는 점에서 매우 좋습니다.

일반적으로 WPexplorer에서 튜토리얼을 만들 때 방법을 단계별로 설명하지만 오늘의 내용이 조금 길기 때문에 전체 프로세스를 설명한 다음 코드에 직접 주석이 포함된 전체 코드를 제공하는 것을 선호합니다.

단축 코드 내에서 수행

그래서 [woocommerce_recently_viewed_products per_page=”5″] 단축 코드를 등록하는 플러그인을 만들어 보겠습니다. 플러그인을 만드는 이유는 무엇입니까? 모든 테마에 사용할 수 있는 기능을 저장하는 가장 쉬운 방법이기 때문입니다. 테마에 단축코드를 등록하기로 결정한 경우 해당 단축코드는 테마가 활성화된 경우에만 사용할 수 있습니다. 플러그인을 사용하면 사용 중인 테마에 관계없이 해당 기능을 계속 사용할 수 있습니다. 또 다른 매우 중요한 점은 WooCommerce 파일을 절대 수정해서는 안 된다는 것입니다.

쿠키를 좋아하시나요? 정말 그렇습니다!

기본적으로 WooCommerce는 방문자가 상점에서 무엇을 하고 보는지에 대한 중요한 데이터를 저장하는 쿠키를 생성합니다. 이것이 바로 플러그인을 만드는 데 필요한 데이터 유형입니다. 우리에게 필요한 가장 중요한 데이터는 $_COOKIE['woocommerce_recently_viewed']라는 쿠키에 저장됩니다. 기본적으로 이 쿠키는 가장 최근에 본 제품의 ID를 저장합니다. WooCommerce는 이미 이러한 ID를 저장하고 있으므로 최종적으로 "post__in" 쿼리 속성을 사용하여 좋은 쿼리를 생성하고 표시해야 하는 제품의 재고가 있는지 확인하는 것이 우리의 임무입니다. 그렇게 하려면 'meta_query' 쿼리 속성에  $woocommerce->query->stock_status_meta_query() 메소드를 사용해야 합니다.

플러그인 전체 코드

코드가 매우 간단하기 때문에 코드에 직접 주석을 추가했으며 단계별 튜토리얼을 수행하지는 않았지만 명확하지 않은 부분이 있으면 주석을 작성해 주시면 기꺼이 설명해 드리겠습니다. 코드의 일부!

<?php
/*
Plugin Name: WooCommerce - Recently Viewed Products
Plugin URL: http://remicorson.com/
Description: Adds a "recently viewed products" shortcode
Version: 1.0
Author: Remi Corson
Author URI: http://remicorson.com
Contributors: corsonr
Text Domain: rc_wc_rvp
Domain Path: languages
*/

/**
 * Register the [woocommerce_recently_viewed_products per_page="5"] shortcode
 *
 * This shortcode displays recently viewed products using WooCommerce default cookie
 * It only has one parameter "per_page" to choose number of items to show
 *
 * @access      public
 * @since       1.0 
 * @return      $content
*/
function rc_woocommerce_recently_viewed_products( $atts, $content = null ) {

	// Get shortcode parameters
	extract(shortcode_atts(array(
		"per_page" => '5'
	), $atts));

	// Get WooCommerce Global
	global $woocommerce;

	// Get recently viewed product cookies data
	$viewed_products = ! empty( $_COOKIE['woocommerce_recently_viewed'] ) ? (array) explode( '|', $_COOKIE['woocommerce_recently_viewed'] ) : array();
	$viewed_products = array_filter( array_map( 'absint', $viewed_products ) );

	// If no data, quit
	if ( empty( $viewed_products ) )
		return __( 'You have not viewed any product yet!', 'rc_wc_rvp' );

	// Create the object
	ob_start();

	// Get products per page
	if( !isset( $per_page ) ? $number = 5 : $number = $per_page )

	// Create query arguments array
    $query_args = array(
    				'posts_per_page' => $number, 
    				'no_found_rows'  => 1, 
    				'post_status'    => 'publish', 
    				'post_type'      => 'product', 
    				'post__in'       => $viewed_products, 
    				'orderby'        => 'rand'
    				);

	// Add meta_query to query args
	$query_args['meta_query'] = array();

    // Check products stock status
    $query_args['meta_query'][] = $woocommerce->query->stock_status_meta_query();

	// Create a new query
	$r = new WP_Query($query_args);

	// If query return results
	if ( $r->have_posts() ) {

		$content = '<ul class="rc_wc_rvp_product_list_widget">';

		// Start the loop
		while ( $r->have_posts()) {
			$r->the_post();
			global $product;

			$content .= '<li>
				<a href="' . get_permalink() . '">
					' . ( has_post_thumbnail() ? get_the_post_thumbnail( $r->post->ID, 'shop_thumbnail' ) : woocommerce_placeholder_img( 'shop_thumbnail' ) ) . ' ' . get_the_title() . '
				</a> ' . $product->get_price_html() . '
			</li>';
		}

		$content .= '</ul>';

	}

	// Get clean object
	$content .= ob_get_clean();
	
	// Return whole content
	return $content;
}

// Register the shortcode
add_shortcode("woocommerce_recently_viewed_products", "rc_woocommerce_recently_viewed_products");