
Таблицы цен являются ключевым компонентом вашего бизнеса, который продвигает ваши продукты и помогает пользователям выбирать между различными услугами, которые вы имеете. Большинство современных коммерческих тем WordPress предоставляют встроенные таблицы цен. Есть также множество бесплатных и коммерческих плагинов таблицы цен для WordPress. Это руководство предназначено для того, чтобы предоставить разработчикам WordPress знания о создании плагина с нуля, который позволяет настраивать различные проекты.
Каждый веб-дизайн пытается реализовать адаптивные функции, которые позволяют лучше выглядеть и чувствовать себя на любом устройстве. Таблицы цен, созданные с помощью этого плагина, будут работать на любых устройствах, таких как мобильные телефоны и планшеты. Итак, начнем.
Вы можете взглянуть на окончательный дизайн таблицы цен на следующем экране.

Планирование плагина таблицы цен
Планирование — сложная часть любого проекта. Лучше спланировать, как мы будем разрабатывать таблицу цен и какие методы мы будем использовать, прежде чем приступать к программированию. В основном таблица цен будет содержать следующие компоненты:
- 
 Таблица цен — это набор различных видов пакетов, доступных для вашего продукта или услуги.  Поскольку мы планируем создать несколько таблиц ценообразования, лучше выбрать пользовательский тип 
pricing_tablesназываетсяpricing_tables. -   Пакет ценообразования — это набор функций вашего продукта, который варьируется в зависимости от пакета.  Так как таблицы цен могут содержать несколько пакетов, будет использоваться пользовательский тип 
pricing_packagesназываемыйpricing_packages. - Особенности пакета — это коллекция уникальных элементов вашего товара или услуги. Функции будут добавляться динамически с использованием настраиваемых полей в процессе создания тарифного пакета.
 - Дизайн таблицы цен — мы можем выбрать шаблон страницы или шорткод для отображения таблиц цен. Мы будем использовать шорткод в этом плагине.
 
Создание ценовых пакетов
  Мы собираемся использовать пользовательский тип записи, который называется pricing_packages .  Вы можете просто сгенерировать код для создания пользовательского типа поста с помощью онлайн-генератора кода.  Следующий код создает пользовательский тип публикации для пакетов с использованием конфигураций по умолчанию: 
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
 | 
 add_action( ‘init’, ‘wppt_register_cpt_pricing_packages’ ); 
function wppt_register_cpt_pricing_packages() { 
    $labels = array( 
        ‘name’ => _x( ‘Pricing Packages’, ‘pricing_packages’ ), 
        ‘singular_name’ => _x( ‘Pricing Package’, ‘pricing_packages’ ), 
        ‘add_new’ => _x( ‘Add New’, ‘pricing_packages’ ), 
        ‘add_new_item’ => _x( ‘Add New Pricing Package’, ‘pricing_packages’ ), 
        ‘edit_item’ => _x( ‘Edit Pricing Package’, ‘pricing_packages’ ), 
        ‘new_item’ => _x( ‘New Pricing Package’, ‘pricing_packages’ ), 
        ‘view_item’ => _x( ‘View Pricing Package’, ‘pricing_packages’ ), 
        ‘search_items’ => _x( ‘Search Pricing Packages’, ‘pricing_packages’ ), 
        ‘not_found’ => _x( ‘No Pricing Packages found’, ‘pricing_packages’ ), 
        ‘not_found_in_trash’ => _x( ‘No Pricing Packages found in Trash’, ‘pricing_packages’ ), 
        ‘parent_item_colon’ => _x( ‘Parent Pricing Package:’, ‘pricing_packages’ ), 
        ‘menu_name’ => _x( ‘Pricing Packages’, ‘pricing_packages’ ), 
    ); 
    $args = array( 
        ‘labels’ => $labels, 
        ‘hierarchical’ => false, 
        ‘description’ => ‘Pricing Packages’, 
        ‘supports’ => array( ‘title’, ‘editor’ ), 
        ‘public’ => true, 
        ‘show_ui’ => true, 
        ‘show_in_menu’ => true, 
        ‘show_in_nav_menus’ => true, 
        ‘publicly_queryable’ => true, 
        ‘exclude_from_search’ => false, 
        ‘has_archive’ => true, 
        ‘query_var’ => true, 
        ‘can_export’ => true, 
        ‘rewrite’ => true, 
        ‘capability_type’ => ‘post’ 
    ); 
    register_post_type( ‘pricing_packages’, $args ); 
} 
 | 
Использование пользовательских полей для информации о пакете
Название пакета, цена и ссылка на покупку являются наиболее важными компонентами в ценовом пакете. Поэтому мы будем использовать мета-поле для добавления этих полей. Также нам требуется несколько функций для пакета. Мы собираемся использовать другой мета-блок для динамического добавления и удаления функций, как показано в коде ниже.
| 
 1 
2 
3 
4 
5 
6 
7 
8 
 | 
 add_action( ‘add_meta_boxes’, ‘wppt_pricing_packages_meta_boxes’ ); 
function wppt_pricing_packages_meta_boxes() { 
    add_meta_box( «pricing-package-info», «Pricing Package Info», ‘wppt_generate_pricing_package_info’, «pricing_packages», «normal», «high» ); 
    add_meta_box( «pricing-features-info», «Pricing Features», ‘wppt_generate_pricing_features_info’, «pricing_packages», «normal», «high» ); 
} 
 | 
  Мета-боксы для полей пакета добавляются с add_meta_boxes действия add_meta_boxes .  Вы можете использовать один метабокс вместо двух.  Я использовал два метабокса, чтобы прояснить ситуацию. 

| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
 | 
 function wppt_generate_pricing_package_info() { 
    global $post; 
    $package_price = get_post_meta( $post->ID, «_package_price», true ); 
    $package_buy_link = get_post_meta( $post->ID, «_package_buy_link», true ); 
    $html = ‘<input type=»hidden» name=»pricing_package_box_nonce» value=»‘ . wp_create_nonce( basename( __FILE__ ) ) . ‘» />’; 
    $html .= ‘<table class=»form-table»>’; 
    $html .= ‘<tr>’; 
    $html .= ‘ <th><label for=»Price»>Package Price *</label></th>’; 
    $html .= ‘ <td>’; 
    $html .= ‘ <input name=»package_price» id=»package_price» type=»text» value=»‘ . $package_price . ‘» />’; 
    $html .= ‘ </td>’; 
    $html .= ‘</tr>’; 
    $html .= ‘<tr>’; 
    $html .= ‘ <th><label for=»Buy Now»>Buy Now Link *</label></th>’; 
    $html .= ‘ <td>’; 
    $html .= ‘ <input name=»package_buy_link» id=»package_buy_link» type=»text» value=»‘ . $package_buy_link . ‘» />’; 
    $html .= ‘ </td>’; 
    $html .= ‘</tr>’; 
    $html .= ‘</tr>’; 
    $html .= ‘</table>’; 
    echo $html; 
} 
 | 
  Первый мета-блок будет содержать поля для цены и ссылки покупки.  Эти 2 поля будут сохранены в таблице _package_price с использованием _package_price и _package_buy_link соответственно. 
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
 | 
 function wppt_generate_pricing_features_info() { 
    global $post; 
    $package_features = get_post_meta( $post->ID, «_package_features», true ); 
    $package_features = ( $package_features == » ) ? 
    $html .= ‘<table class=»form-table»>’; 
    $html .= ‘<tr><th><label for=»Price»>Add Package Features</label></th>’; 
    $html .= ‘ <td> 
    $html .= ‘ <input name=»package_feature» id=»package_feature» type=»text» />’; 
    $html .= ‘ <input type=»button» id=»add_features» value=»Add Features» />’; 
    $html .= ‘ </td></tr>’; 
    $html .= ‘<tr><td>’; 
    $html .= ‘ <ul id=»package_features_box» name=»package_features_box» >’; 
    foreach ($package_features as $package_feature) { 
        $html .= ‘<li><input type=»hidden» name=»package_features[]» value=»‘ . $package_feature . ‘» />’ . 
        $html .= ‘<a href=»javascript:void(0);»>Delete</a></li>’; 
    } 
    $html .= ‘</ul></td></tr>’; 
    $html .= ‘</table>’; 
    echo $html; 
} 
 | 
  Приведенный выше код содержит HTML-код для полей функций пакета.  Один пакет будет содержать много функций, поэтому функции будут динамически добавляться в неупорядоченный список со скрытыми полями с помощью jQuery.  Функции будут храниться в таблице _package_features ключом _package_features .  Строка в формате JSON будет использоваться для сохранения нескольких функций. 
Проверка создания пакета
Цена пакета и ссылка на покупку обязательны для каждого пакета. Поэтому нам нужен код проверки перед созданием пакетов. Мы будем использовать код JQuery для проверки, как показано ниже.
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
 | 
 jQuery(document).ready(function($) { 
    $(«#post-body-content»).prepend(‘<div id=»pricing_error» class=»error» style=»display:none» ></div>’); 
    $(‘#post’).submit(function() { 
        if ( $(«#post_type»).val() ==’pricing_packages’ ) { 
            return wppt_validate_pricing_packages(); 
        } 
        else if ( $(«#post_type»).val() ==’pricing_tables’ ) { 
            return wppt_validate_pricing_tables(); 
        } 
    }); 
}); 
 | 
  Нам нужно добавить элемент div на экран создания поста для отображения ошибок.  Экран создания поста содержит форму с идентификатором поста.  Он также не изменяется для пользовательских типов записей.  Поэтому я использовал событие #post формы #post для проверки. 

  Поскольку мы используем разные пользовательские типы записей, необходимо отфильтровать тип записей с помощью приведенного ниже кода.  Форма создания записи содержит скрытое поле с идентификатором post_type . 
| 
 1 
2 
3 
4 
5 
6 
 | 
 if ( $(«#post_type»).val() ==’pricing_packages’) { 
    return wppt_validate_pricing_packages(); 
} 
else if ( $(«#post_type»).val() ==’pricing_tables’ ) { 
    return wppt_validate_pricing_tables(); 
} 
 | 
Когда фильтрация завершена, мы вызываем специальную функцию проверки в соответствии с типом записи, как показано ниже.
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
 | 
 var wppt_validate_pricing_packages = function() { 
    var err = 0; 
    $(«#pricing_error»).html(«»); 
    $(«#pricing_error»).hide(); 
    if ( $(«#title»).val() == » ) { 
        $(«#pricing_error»).append( «<p>Please enter Package Name.</p>» ); 
        err++; 
    } 
    if ( $(«#package_price»).val() == » ) { 
        $(«#pricing_error»).append( «<p>Please enter Package Price.</p>» ); 
        err++; 
    } 
    if ( $(«#package_buy_link»).val() == » ) { 
        $(«#pricing_error»).append( «<p>Please enter Package Buy Link.</p>» ); 
        err++; 
    } 
    if ( err > 0 ) { 
        $(«#publish»).removeClass( «button-primary-disabled» ); 
        $(«#ajax-loading»).hide(); 
        $(«#pricing_error»).show(); 
        return false; 
    } 
    else { 
        return true; 
    } 
}; 
 | 
  Сначала мы pricing_error любые существующие ошибки, установленные ранее внутри элемента pricing_error .  Затем мы можем проверить каждое поле и добавить сообщение об ошибке в контейнер pricing_error .  Наконец, мы отображаем ошибки, используя функцию $("#pricing_error").show() . 
$("#publish").removeClass("button-primary-disabled") .  Также мы можем остановить загрузку изображения ajax, используя $("#ajax-loading").hide() . Сохранить информацию о пакете
  Теперь мы завершили все полевые создания и проверки для пакетов.  Давайте перейдем к сохранению информации в базе данных.  Мы будем использовать действие save_post которое выполняется сразу после сохранения записи в базе данных. 
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
 | 
 add_action( ‘save_post’, ‘wppt_save_pricing_packages’ ); 
function wppt_save_pricing_packages( $post_id ) { 
    if ( ! wp_verify_nonce( $_POST[‘pricing_package_box_nonce’], basename( __FILE__ ) ) ) { 
        return $post_id; 
    } 
    if ( defined( ‘DOING_AUTOSAVE’ ) && DOING_AUTOSAVE ) { 
        return $post_id; 
    } 
    if ( ‘pricing_packages’ == $_POST[‘post_type’] && current_user_can( ‘edit_post’, $post_id ) ) { 
        $package_price = ( isset( $_POST[‘package_price’] ) ? $_POST[‘package_price’] : » ); 
        $package_buy_link = ( isset( $_POST[‘package_buy_link’] ) ? $_POST[‘package_buy_link’] : » ); 
        $package_features = ( isset( $_POST[‘package_features’] ) ? $_POST[‘package_features’] : array() ); 
        $package_features = json_encode( $package_features ); 
        update_post_meta( $post_id, «_package_price», $package_price ); 
        update_post_meta( $post_id, «_package_buy_link», $package_buy_link ); 
        update_post_meta( $post_id, «_package_features», $package_features ); 
    } 
    else { 
        return $post_id; 
    } 
} 
 | 
  Сначала мы делаем некоторые проверки, чтобы проверить, совпадает ли одноразовое значение, сгенерированное в форме, со значением одноразового номера, полученным в $_POST  Затем мы должны убедиться, что это автоматическое или ручное сохранение.  Далее мы должны проверить тип записи перед сохранением.  В противном случае этот код будет выполняться для каждого типа сообщения.  Цена пакета и ссылка на покупку будут сохранены непосредственно в таблице post_meta с update_post_meta функции update_post_meta .  Элементы будут сохранены в виде строки в кодировке JSON.  Теперь мы закончили с созданием пакетов.  Давайте перейдем к созданию таблиц цен. 
Создание таблиц цен
Таблицы цен будут другим типом постов в нашем плагине. Создание и сохранение пользовательского типа поста в базе данных очень похоже на код, описанный ранее. Поэтому я не буду скучать, объясняя то же самое. Вы можете найти пользовательский пост создания и сохранения кода для таблиц цен в файлах плагинов.
Таблицы цен содержат ценовые пакеты. Следовательно, мета-блоки, используемые для таблиц цен, будут отличаться от тех, которые мы использовали для пакетов цен. Давайте посмотрим на создание метабокса для таблиц цен.
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
 | 
 add_action( ‘add_meta_boxes’, ‘wppt_pricing_tables_meta_boxes’ ); 
function wppt_pricing_tables_meta_boxes() { 
    add_meta_box( «pricing-table-info», «Pricing Table Info», ‘wppt_generate_pricing_table_info’, «pricing_tables», «normal», «high» ); 
} 
function wppt_generate_pricing_table_info() { 
    global $post; 
    $table_packages = get_post_meta( $post->ID, «_table_packages», true ); 
    $table_packages = ( $table_packages == » ) ? 
    $query = new WP_Query( array( 
        ‘post_type’ => ‘pricing_packages’, 
        ‘post_status’ => ‘publish’, 
        ‘posts_per_page’ => -1, 
        ‘orderby’ => ‘post_date’, 
        ‘order’ => ‘ASC’ 
    ) ); 
    $html = ‘<input type=»hidden» name=»pricing_table_box_nonce» value=»‘ . wp_create_nonce( basename( __FILE__ ) ) . ‘» />’; 
    $html .= ‘<table class=»form-table»>’; 
    $html .= ‘<tr><th>Package Status</th>’; 
    $html .= ‘ <td>Package Name</td></tr>’; 
    while ( $query->have_posts() ) : $query->the_post(); 
        $checked_status = ( in_array( $query->post->ID, $table_packages ) ) ? 
        $html .= ‘<tr><th><input type=»checkbox» name=»pricing_table_packages[]» ‘ . 
        $html .= ‘ <td>’ . 
    endwhile; 
    $html .= ‘</table>’; 
    echo $html; 
} 
 | 

  Мы можем добавить собственный мета-бокс для таблиц цен, используя код, аналогичный тому, который использовался в предыдущем разделе  Пакеты конкретной таблицы будут храниться в таблице post_meta в виде строки в кодировке JSON.  Таким образом, мы получаем пакеты для текущей таблицы, используя функцию get_post_meta .  Затем мы получаем все опубликованные ценовые пакеты, используя пользовательский запрос, как показано ниже. 
| 
 1 
2 
3 
4 
5 
6 
7 
 | 
 $query = new WP_Query( array( 
    ‘post_type’ => ‘pricing_packages’, 
    ‘post_status’ => ‘publish’, 
    ‘posts_per_page’ => -1, 
    ‘orderby’ => ‘post_date’, 
    ‘order’ => ‘ASC’ 
) ); 
 | 
  Мы можем выбрать пакеты, используя пользовательский тип поста pricing_packages .  Вы можете выбрать другие условия для запроса в соответствии с вашими предпочтениями. 
WP_Query вернет количество записей по умолчанию в результате, если posts_per_page не указан.  Вы можете получить все сообщения без ограничений, используя -1 для условия posts_per_page .   Затем мы используем результат, сгенерированный из WP_Query для отображения всех ценовых пакетов с WP_Query перед ними.  Зацикливаясь, мы проверяем, назначен ли пакет таблице, и присваиваем галочку.  Вы можете добавлять или удалять пакеты динамически, устанавливая / снимая флажки и нажимая кнопку обновления. 
Проверка создания таблицы цен
Мы собираемся проверить имя таблицы цен, как мы делали это ранее с пакетами цен. Следующий код jQuery будет использоваться для проверки:
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
 | 
 var wppt_validate_pricing_tables = function() { 
    var err = 0; 
    $(«#pricing_error»).html(«»); 
    $(«#pricing_error»).hide(); 
    if ( $(«#title»).val() == » ) { 
        $(«#pricing_error»).append( «<p>Please enter Pricing Table Name.</p>» ); 
        err++; 
    } 
    if ( err > 0 ) { 
        $(«#publish»).removeClass( «button-primary-disabled» ); 
        $(«#ajax-loading»).hide(); 
        $(«#pricing_error»).show(); 
        return false; 
    } 
    else { 
        return true; 
    } 
}; 
 | 
Приведенный выше код включен в файл pricing_admin.js в папке js плагина.
Создание идентификатора таблицы цен
Для включения таблиц в шорткод нам нужен уникальный ключ. Поэтому мы будем использовать идентификатор таблицы цен в качестве ключа. После того, как таблица создана, мы можем показать идентификатор таблицы цен в виде списка, используя пользовательский столбец. WordPress предоставляет простую технику для включения пользовательских столбцов в представление списка, как показано ниже:

| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
 | 
 add_filter( ‘manage_edit-pricing_tables_columns’, ‘wppt_edit_pricing_tables_columns’ ); 
function wppt_edit_pricing_tables_columns( $columns ) { 
    $columns = array( 
        ‘cb’ => ‘<input type=»checkbox» />’, 
        ‘ID’ => __( ‘Pricing Table ID’ ), 
        ‘title’ => __( ‘Pricing Table Name’ ), 
        ‘date’ => __( ‘Date’ ) 
    ); 
    return $columns; 
} 
 | 
  Мы можем использовать manage_edit-{Custom Post Type}_columns для настройки столбцов, отображаемых в виде списка.  Как видите, я назначил пользовательский столбец с именем Pricing Table ID для использования идентификатора поста. 
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
 | 
 add_action( ‘manage_pricing_tables_posts_custom_column’, ‘wppt_manage_pricing_tables_columns’, 10, 2 ); 
function wppt_manage_pricing_tables_columns( $column, $post_id ) { 
    global $post; 
    switch ( $column ) { 
        case ‘ID’ : 
            $pricing_id = $post_id; 
            if ( empty( $pricing_id ) ) 
                echo __( ‘Unknown’ ); 
            else 
                printf( $pricing_id ); 
            break; 
        default : 
            break; 
    } 
} 
add_filter( ‘manage_edit-pricing_tables_sortable_columns’, ‘wppt_pricing_tables_sortable_columns’ ); 
function wppt_pricing_tables_sortable_columns( $columns ) { 
    $columns[‘ID’] = ‘ID’; 
    return $columns; 
} 
 | 
  Затем мы можем присвоить значения столбцу с помощью оператора switch для действия manage_{Custom Post Type}_posts_custom_column .  Наконец, мы используем manage_edit-{Custom Post Type}_sortable_columns для manage_edit-{Custom Post Type}_sortable_columns столбца.  После создания таблицы цен вы сможете увидеть номер в списке. 
Включая скриптовые плагины и стили
Мы использовали пользовательский файл JavaScript для проверки функций области администратора. Итак, сначала мы рассмотрим, как файлы скриптов включены в область администрирования WordPress.
| 
 1 
2 
3 
4 
5 
6 
7 
 | 
 function wppt_pricing_admin_scripts() { 
    wp_register_script( ‘pricing-admin’, plugins_url( ‘js/pricing_admin.js’, __FILE__ ), array( ‘jquery’ ) ); 
    wp_enqueue_script( ‘pricing-admin’ ); 
} 
add_action( ‘admin_enqueue_scripts’, ‘wppt_pricing_admin_scripts’ ); 
 | 
  admin_enqueue_scripts — это хук, который можно использовать для включения всех файлов CSS и Script в области администрирования WordPress.  Сначала мы должны зарегистрировать скрипт, используя функцию wp_register_script с уникальным ключом и путем к файлу.  Затем мы можем использовать функцию wp_enqueue_script для включения файлов. 
Теперь давайте рассмотрим включение стилей и сценариев внешнего интерфейса с помощью приведенного ниже кода:
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
 | 
 function wppt_pricing_front_scripts() { 
    wp_register_style( ‘pricing-base’, plugins_url( ‘css/base.css’, __FILE__ ) ); 
    wp_enqueue_style( ‘pricing-base’ ); 
    wp_register_style( ‘pricing-layout’, plugins_url( ‘css/layout.css’, __FILE__ ) ); 
    wp_enqueue_style( ‘pricing-layout’ ); 
    wp_register_style( ‘pricing-fluid-skeleton’, plugins_url( ‘css/fluid_skeleton.css’, __FILE__ ) ); 
    wp_enqueue_style( ‘pricing-fluid-skeleton’ ); 
    wp_register_style( ‘pricing-table’, plugins_url( ‘css/pricing_table.css’, __FILE__ ) ); 
    wp_enqueue_style( ‘pricing-table’ ); 
} 
add_action( ‘wp_enqueue_scripts’, ‘wppt_pricing_front_scripts’ ); 
 | 
В начале урока я упомянул, что мы будем создавать адаптивную таблицу цен. Проще работать с существующей структурой CSS, чтобы обеспечить адаптивную функциональность. Поэтому я выбрал Skeleton в качестве фреймворка CSS. Первые три CSS-файла будут CSS-файлами фреймворка Skeleton, затем мы включили пользовательский стиль для нашей таблицы цен в файл pricing_table.css .
Теперь все данные, необходимые для таблицы цен, готовы, и мы можем перейти к созданию дизайна таблицы цен.
Разработка таблицы цен
  Разработка адаптивной таблицы цен является трудоемкой задачей и требует глубоких знаний в области HTML и CSS.  Следовательно, объяснение дизайна выходит за рамки данного руководства.  Я буду использовать адаптивную таблицу цен, которую я создал для Webdesigntuts +.  Если вы заинтересованы, вы можете узнать о проектной части, прочитав Учебное пособие по адаптивному ценообразованию с использованием :target для маленьких экранов .  Следующий код содержит HTML-код таблицы цен с двумя пакетами: 
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
 | 
         <div class=»container»> 
            <div id=’pricing_plan1′ class=»four columns»> 
                <dl class=’plans’ > 
                    <dd class=»plan_title»> 
                        Basic 
                    </dd> 
                    <dd class=»plan_price»> 
                        $9.99 
                    </dd> 
                </dl> 
                <dl class=’plan’ id=»one»> 
                    <dt class=’plan_more’>View<a href=»#one» class=»more_icon»></a><a href=»#» 
class=»less_icon»></a></dt> 
                    <dd class=»plan_features»> 
                        <div class=»feature_desc»><span class=»highlight»>1GB 
                    </dd> 
                    <dd class=»plan_features»> 
                        <div class=»feature_desc»><span class=»highlight»>5GB 
                    </dd> 
                    <dd class=»plan_features»> 
                        <div class=»feature_desc»><span class=»highlight»>2 
                    </dd> 
                    <dd class=»plan_features»> 
                        <div class=»feature_desc»><span class=»highlight»>3 
                    </dd> 
                    <dd class=»plan_features»> 
                        <div class=»feature_desc»><span class=»highlight»>1 
                    </dd> 
                    <dd class=»plan_features»> 
                        <div class=»feature_desc»><span class=»highlight»>25 
                    </dd> 
                    <dd class=»plan_buy»> 
                        <a href=» class=’buy’ >Buy Now</a> 
                    </dd> 
                </dl> 
            </div> 
            <div id=’pricing_plan2′ class=»four columns»> 
                <dl class=’plans’> 
                    <dt class=»plan_title»> 
                        Standard 
                    </dt> 
                    <dd class=»plan_price»> 
                        $19.99 
                    </dd> 
                </dl> 
                <dl class=’plan’ id=»two»> 
                    <dt class=’plan_more’>View<a href=»#two» class=»more_icon»></a><a href=»#» 
                    class=»less_icon»></a></dt> 
                    <dd class=»plan_features»> 
                        <div class=»feature_desc»><span class=»highlight»>10GB 
                    </dd> 
                    <dd class=»plan_features»> 
                        <div class=»feature_desc»><span class=»highlight»>50GB 
                    </dd> 
                    <dd class=»plan_features»> 
                        <div class=»feature_desc»><span class=»highlight»>10 
                    </dd> 
                    <dd class=»plan_features»> 
                        <div class=»feature_desc»><span class=»highlight»>25 
                    </dd> 
                    <dd class=»plan_features»> 
                        <div class=»feature_desc»><span class=»highlight»>10 
                    </dd> 
                    <dd class=»plan_features»> 
                        <div class=»feature_desc»><span class=»highlight»>100 
                    </dd> 
                    <dd class=»plan_buy»> 
                        <a href=» class=»buy»>Buy Now</a> 
                    </dd> 
                </dl> 
            </div> 
        </div> 
 | 
Теперь нам нужно выбрать метод для включения кода таблицы цен в WordPress. Мы можем включить этот код в шорткод или создать конкретный шаблон страницы. Я собираюсь использовать шорткод. Вы также можете попробовать метод шаблона страницы.
Создание цены Shortocde
  Шорткоды — это простой способ добавления динамических функций в ваши сообщения и страницы.  Я буду использовать wppt_show_pricing для вставки таблицы цен.  Мы должны передать идентификатор таблицы цен в качестве параметра pricing_id ключа pricing_id .  Давайте реализуем шорткод. 
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
 | 
 add_shortcode( «wppt_show_pricing», «wppt_generate_pricing_table» ); 
function wppt_generate_pricing_table( $atts ) { 
    global $post; 
    extract( shortcode_atts( array( 
        ‘pricing_id’ => ‘0’, 
    ), $atts ) ); 
    // Remaining Code 
} 
 | 
  Я определил wppt_show_pricing используя функцию wppt_show_pricing WordPress.  Атрибуты шорткода будут автоматически переданы в функцию. Сначала мы извлекаем массив шорткодов, а идентификатор таблицы цен будет назначен переменной pricing_id .  Остальная часть кода будет объяснена в следующих разделах. 
| 
 1 
2 
3 
 | 
 global $post; 
$table_packages = get_post_meta( $pricing_id, «_table_packages», true ); 
$table_packages = ( $table_packages == » ) ? 
 | 
  Затем мы получаем идентификатор таблицы цен, присвоенный шорткоду, и все пакеты, включенные в таблицу цен, из таблицы post_meta . 
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
 | 
 $html = ‘<div class=»container»>’; 
    $pricing_index = 0; 
    foreach ( $table_packages as $table_package ) { 
        $pricing_index++; 
        $plan_title = get_the_title( $table_package ); 
        $package_price = get_post_meta( $table_package, «_package_price», true ); 
        $package_buy_link = get_post_meta( $table_package, «_package_buy_link», true ); 
        $package_features = get_post_meta( $table_package, «_package_features», true ); 
        $package_features = ( $package_features == » ) ? 
        $html .= ‘<div id=»pricing_plan’ . $pricing_index . ‘» class=»four columns»>’; 
        $html .= ‘<dl class=»plans»> 
                    <dd class=»plan_title»> 
                    ‘ . 
                    </dd> 
                    <dd class=»plan_price»> 
                        $’ . 
                    </dd> 
                </dl>’; 
        $html .= ‘<dl class=»plan» id=»pr’ . $pricing_index . ‘»> 
                    <dt class=»plan_more»>View<a href=»#pr’ . $pricing_index . ‘» class=»more_icon»></a> 
                        <a href=»#» class=»less_icon»></a> 
                    </dt>’; 
        foreach ( $package_features as $package_feature ) { 
            $html .= ‘<dd class=»plan_features»> 
                        <div class=»feature_desc»><span class=»highlight»>’ . 
                    </dd>’; 
        } 
        $html .= ‘<dd class=»plan_buy»> 
                    <a href=»‘ . $package_price . ‘» class=»buy» >Buy Now</a> 
                </dd> 
            </dl>’; 
        $html .= ‘</div>’; 
    } 
    $html .= ‘</div>’; 
    echo $html; 
 | 
  Обходя каждый пакет, сгенерированный в предыдущем коде, мы получаем функции и детали пакетов, используя функцию get_post_meta .  Затем мы включаем HTML-код с динамическими данными для отображения таблицы цен.  Наконец мы возвращаем сгенерированный HTML-код для отображения на страницах, которые содержат шорткод. 
Сейчас мы завершили разработку нашего плагина таблицы цен для WordPress. Вы можете просмотреть исходный код и добавить свои собственные функции в соответствии с вашими предпочтениями.
Руководство по использованию таблицы цен
Любой, кто имеет базовые знания по работе с WordPress, сможет создавать таблицы цен с помощью этого плагина. Я предоставлю шаги, чтобы сделать его проще для пользователей, не имеющих большого опыта в WordPress.
- Нажмите на раздел «Пакеты ценообразования» в левом меню и создайте пакет с названием, ценой, ссылкой на покупку и функциями. Продолжайте этот процесс, пока не создадите все свои пакеты.
 - Затем нажмите на Таблицы цен в левом меню, чтобы добавить новую таблицу цен. Список ценовых пакетов отобразится внизу экрана. Выберите пакеты, которые вы хотите, и сохраните таблицу цен с указанным именем.
 - Перейдите к списку таблицы цен и найдите идентификатор таблицы цен вновь созданной таблицы.
 -   Затем нажмите на раздел Страницы, чтобы добавить новую страницу.  Введите 
[wppt_show_pricing pricing_id='ID' /]в редакторе страниц. Замените идентификатор фактическим идентификатором таблицы цен. - Сохраните страницу и просмотрите ее в браузере. Вы получите отзывчивую таблицу цен.
 
Я надеюсь, что вы узнали, как использовать пользовательские типы записей и мета-боксы для создания таблицы цен. Дайте нам знать, если у вас есть свой способ создания такого плагина через комментарии ниже.