관리-도구
편집 파일: class-kkart-admin-pointers.php
<?php /** * Adds and controls pointers for contextual help/tutorials * * @package Kkart\Admin\Pointers * @version 2.4.0 */ if ( ! defined( 'ABSPATH' ) ) { exit; } /** * KKART_Admin_Pointers Class. */ class KKART_Admin_Pointers { /** * Constructor. */ public function __construct() { add_action( 'admin_enqueue_scripts', array( $this, 'setup_pointers_for_screen' ) ); } /** * Setup pointers for screen. */ public function setup_pointers_for_screen() { $screen = get_current_screen(); if ( ! $screen ) { return; } switch ( $screen->id ) { case 'product': $this->create_product_tutorial(); break; } } /** * Pointers for creating a product. */ public function create_product_tutorial() { if ( ! isset( $_GET['tutorial'] ) || ! current_user_can( 'manage_options' ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended return; } // These pointers will chain - they will not be shown at once. $pointers = array( 'pointers' => array( 'title' => array( 'target' => '#title', 'next' => 'content', 'next_trigger' => array( 'target' => '#title', 'event' => 'input', ), 'options' => array( 'content' => '<h3>' . esc_html__( 'Product name', 'kkart' ) . '</h3>' . '<p>' . esc_html__( 'Give your new product a name here. This is a required field and will be what your customers will see in your store.', 'kkart' ) . '</p>', 'position' => array( 'edge' => 'top', 'align' => 'left', ), ), ), 'content' => array( 'target' => '#wp-content-editor-container', 'next' => 'product-type', 'next_trigger' => array(), 'options' => array( 'content' => '<h3>' . esc_html__( 'Product description', 'kkart' ) . '</h3>' . '<p>' . esc_html__( 'This is your products main body of content. Here you should describe your product in detail.', 'kkart' ) . '</p>', 'position' => array( 'edge' => 'bottom', 'align' => 'middle', ), ), ), 'product-type' => array( 'target' => '#product-type', 'next' => 'virtual', 'next_trigger' => array( 'target' => '#product-type', 'event' => 'change blur click', ), 'options' => array( 'content' => '<h3>' . esc_html__( 'Choose product type', 'kkart' ) . '</h3>' . '<p>' . esc_html__( 'Choose a type for this product. Simple is suitable for most physical goods and services (we recommend setting up a simple product for now).', 'kkart' ) . '</p>' . '<p>' . esc_html__( 'Variable is for more complex products such as t-shirts with multiple sizes.', 'kkart' ) . '</p>' . '<p>' . esc_html__( 'Grouped products are for grouping several simple products into one.', 'kkart' ) . '</p>' . '<p>' . esc_html__( 'Finally, external products are for linking off-site.', 'kkart' ) . '</p>', 'position' => array( 'edge' => 'bottom', 'align' => 'middle', ), ), ), 'virtual' => array( 'target' => '#_virtual', 'next' => 'downloadable', 'next_trigger' => array( 'target' => '#_virtual', 'event' => 'change', ), 'options' => array( 'content' => '<h3>' . esc_html__( 'Virtual products', 'kkart' ) . '</h3>' . '<p>' . esc_html__( 'Check the "Virtual" box if this is a non-physical item, for example a service, which does not need shipping.', 'kkart' ) . '</p>', 'position' => array( 'edge' => 'bottom', 'align' => 'middle', ), ), ), 'downloadable' => array( 'target' => '#_downloadable', 'next' => 'regular_price', 'next_trigger' => array( 'target' => '#_downloadable', 'event' => 'change', ), 'options' => array( 'content' => '<h3>' . esc_html__( 'Downloadable products', 'kkart' ) . '</h3>' . '<p>' . esc_html__( 'If purchasing this product gives a customer access to a downloadable file, e.g. software, check this box.', 'kkart' ) . '</p>', 'position' => array( 'edge' => 'bottom', 'align' => 'middle', ), ), ), 'regular_price' => array( 'target' => '#_regular_price', 'next' => 'postexcerpt', 'next_trigger' => array( 'target' => '#_regular_price', 'event' => 'input', ), 'options' => array( 'content' => '<h3>' . esc_html__( 'Prices', 'kkart' ) . '</h3>' . '<p>' . esc_html__( 'Next you need to give your product a price.', 'kkart' ) . '</p>', 'position' => array( 'edge' => 'bottom', 'align' => 'middle', ), ), ), 'postexcerpt' => array( 'target' => '#postexcerpt', 'next' => 'postimagediv', 'next_trigger' => array( 'target' => '#postexcerpt', 'event' => 'input', ), 'options' => array( 'content' => '<h3>' . esc_html__( 'Product short description', 'kkart' ) . '</h3>' . '<p>' . esc_html__( 'Add a quick summary for your product here. This will appear on the product page under the product name.', 'kkart' ) . '</p>', 'position' => array( 'edge' => 'bottom', 'align' => 'middle', ), ), ), 'postimagediv' => array( 'target' => '#postimagediv', 'next' => 'product_tag', 'options' => array( 'content' => '<h3>' . esc_html__( 'Product images', 'kkart' ) . '</h3>' . '<p>' . esc_html__( "Upload or assign an image to your product here. This image will be shown in your store's catalog.", 'kkart' ) . '</p>', 'position' => array( 'edge' => 'right', 'align' => 'middle', ), ), ), 'product_tag' => array( 'target' => '#tagsdiv-product_tag', 'next' => 'product_catdiv', 'options' => array( 'content' => '<h3>' . esc_html__( 'Product tags', 'kkart' ) . '</h3>' . '<p>' . esc_html__( 'You can optionally "tag" your products here. Tags are a method of labeling your products to make them easier for customers to find.', 'kkart' ) . '</p>', 'position' => array( 'edge' => 'right', 'align' => 'middle', ), ), ), 'product_catdiv' => array( 'target' => '#product_catdiv', 'next' => 'submitdiv', 'options' => array( 'content' => '<h3>' . esc_html__( 'Product categories', 'kkart' ) . '</h3>' . '<p>' . esc_html__( 'Optionally assign categories to your products to make them easier to browse through and find in your store.', 'kkart' ) . '</p>', 'position' => array( 'edge' => 'right', 'align' => 'middle', ), ), ), 'submitdiv' => array( 'target' => '#submitdiv', 'next' => '', 'options' => array( 'content' => '<h3>' . esc_html__( 'Publish your product!', 'kkart' ) . '</h3>' . '<p>' . esc_html__( 'When you are finished editing your product, hit the "Publish" button to publish your product to your store.', 'kkart' ) . '</p>', 'position' => array( 'edge' => 'right', 'align' => 'middle', ), ), ), ), ); $this->enqueue_pointers( $pointers ); } /** * Enqueue pointers and add script to page. * * @param array $pointers Pointers data. */ public function enqueue_pointers( $pointers ) { $pointers = rawurlencode( wp_json_encode( $pointers ) ); wp_enqueue_style( 'wp-pointer' ); wp_enqueue_script( 'wp-pointer' ); kkart_enqueue_js( "jQuery( function( $ ) { var kkart_pointers = JSON.parse( decodeURIComponent( '{$pointers}' ) ); setTimeout( init_kkart_pointers, 800 ); function init_kkart_pointers() { $.each( kkart_pointers.pointers, function( i ) { show_kkart_pointer( i ); return false; }); } function show_kkart_pointer( id ) { var pointer = kkart_pointers.pointers[ id ]; var options = $.extend( pointer.options, { pointerClass: 'wp-pointer kkart-pointer', close: function() { if ( pointer.next ) { show_kkart_pointer( pointer.next ); } }, buttons: function( event, t ) { var close = '" . esc_js( __( 'Dismiss', 'kkart' ) ) . "', next = '" . esc_js( __( 'Next', 'kkart' ) ) . "', button = $( '<a class=\"close\" href=\"#\">' + close + '</a>' ), button2 = $( '<a class=\"button button-primary\" href=\"#\">' + next + '</a>' ), wrapper = $( '<div class=\"kkart-pointer-buttons\" />' ); button.bind( 'click.pointer', function(e) { e.preventDefault(); t.element.pointer('destroy'); }); button2.bind( 'click.pointer', function(e) { e.preventDefault(); t.element.pointer('close'); }); wrapper.append( button ); wrapper.append( button2 ); return wrapper; }, } ); var this_pointer = $( pointer.target ).pointer( options ); this_pointer.pointer( 'open' ); if ( pointer.next_trigger ) { $( pointer.next_trigger.target ).on( pointer.next_trigger.event, function() { setTimeout( function() { this_pointer.pointer( 'close' ); }, 400 ); }); } } });" ); } } new KKART_Admin_Pointers();