• ДОБРО ПОЖАЛОВАТЬ В КЛУБ ПО WORDPRESS

    Мы активно растущий клуб по WordPress и нам нужна помощь каждого человека, в том числе и Ваша! Не стесняйтесь и станьте частью большого сообщества.
    Мы делимся новостями, отытом и полезными советами! Пройдите простую регистрацию, чтобы пользоваться всеми возможностями нашего клуба.

    Присоединяйтесь к нам, вам обязательно понравится - Присоединится

Совет Создаем свой собственный тип записей в WordPress

Wildcdu

ЭКСПЕРТ
Кратенько.
На данном примере
Очень просто создать свой собственный тип записей. (изменить или добавить можно что угодно)
Данное можно вставить в функцию темы или подключить как плагин, разницы нет, как я уже писал, выкладываю как плагин.
Как подключить вывод на страницы... оставлю возможность решить Вам
Код:
<?php
/*
Plugin Name: Создаем доп возможности
Plugin URI: http://clubwp.ru
Description: Создаем новые возможности
Version: 1.0
Author: clubwp.ru
Author URI: http://clubwp.ru
License: GPL2
*/
/*  Copyright YEAR  PLUGIN_AUTHOR_NAME  (email : email автора плагина)

    This program is free software; you can avtoistribute it and/or modify
    it under the terms of the GNU General Public License, version 2, as
    published by the Free Software Foundation.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/
?>

<?php
if(is_admin()) {
    wp_enqueue_script('jquery-ui-datepicker','','','',true);
    wp_enqueue_script('media-upload');
    wp_enqueue_script('thickbox');
    wp_enqueue_script('imagefield', WP_PLUGIN_URL.'/imagefield.js', array('jquery','media-upload','thickbox')); // Новая строчка
    wp_enqueue_style('jquery-ui-custom', WP_PLUGIN_URL.'/jquery-ui.css'); // Ваш путь к файлу!!!
}

add_action('admin_head','add_custom_scripts');
function add_custom_scripts() {
    global $avto_meta_fields, $post;
   
    $output = '<script type="text/javascript">
                jquery(function() {';
               
    foreach ($avto_meta_fields as $field) {
        if($field['type'] == 'date')
            $output .= 'jquery(".datepicker").datepicker();';
    }
   
    $output .= '});
        </script>';
       
    echo $output;
}

if ( ! function_exists( 'avto_book_cp' ) ) {

// Опишем требуемый функционал
    function avto_book_cp() {

        $labels = array(
            'name'                => _x( 'Автомобили', 'Post Type General Name', 'avto_book' ),
            'singular_name'       => _x( 'Автомобили', 'Post Type Singular Name', 'avto_book' ),
            'menu_name'           => __( 'Автомобили', 'avto_book' ),
            'parent_item_colon'   => __( 'Родительский:', 'avto_book' ),
            'all_items'           => __( 'Все записи', 'avto_book' ),
            'view_item'           => __( 'Просмотреть', 'avto_book' ),
            'add_new_item'        => __( 'Добавить новую запись', 'avto_book' ),
            'add_new'             => __( 'Добавить новую', 'avto_book' ),
            'edit_item'           => __( 'Редактировать запись', 'avto_book' ),
            'update_item'         => __( 'Обновить запись', 'avto_book' ),
            'search_items'        => __( 'Найти запись', 'avto_book' ),
            'not_found'           => __( 'Не найдено', 'avto_book' ),
            'not_found_in_trash'  => __( 'Не найдено в корзине', 'avto_book' ),
        );
        $args = array(
            'labels'              => $labels,
            'supports'            => array( 'title', 'editor', 'excerpt', ),
            'taxonomies'          => array( 'avto_book_tax' ), // категории, которые мы создадим ниже
            'public'              => true,
            'menu_position'       => 5,
            'menu_icon'           => 'dashicons-book',
        );
        register_post_type( 'avto_book', $args );

    }

    add_action( 'init', 'avto_book_cp', 0 ); // инициализируем

}


if ( ! function_exists( 'avto_book_tax' ) ) {

// Опишем требуемый функционал
    function avto_book_tax() {
        $labels = array(
        'name'                => _x( 'Категории', 'Taxonomy General Name', 'avto_book' ),
        'singular_name'       => _x( 'Категория', 'Taxonomy Singular Name', 'avto_book' ),
        'menu_name'           => __( 'Категории', 'avto_book' ),
        'all_items'           => __( 'Категории', 'avto_book' ),
        'parent_item'         => __( 'Родительская категория', 'avto_book' ),
        'parent_item_colon'   => __( 'Родительская категория:', 'avto_book' ),
        'new_item_name'       => __( 'Новая категория', 'avto_book' ),
        'add_new_item'        => __( 'Добавить новую категорию', 'avto_book' ),
        'edit_item'           => __( 'Редактировать категорию', 'avto_book' ),
        'update_item'         => __( 'Обновить категорию', 'avto_book' ),
        'search_items'        => __( 'Найти', 'avto_book' ),
        'add_or_remove_items' => __( 'Добавить или удалить категорию', 'avto_book' ),
        'choose_from_most_used' => __( 'Поиск среди популярных', 'avto_book' ),
        'not_found'           => __( 'Не найдено', 'avto_book' ),
        );
        $args = array(
            'labels'                     => $labels,
            'hierarchical'               => true,
            'public'                     => true,
        );
        register_taxonomy( 'avto_book_tax', array( 'avto_book' ), $args );

    }

    add_action( 'init', 'avto_book_tax', 0 ); // инициализируем

}

function avtobook_meta_box() {
    add_meta_box(
        'avtobook_meta_box', // Идентификатор(id)
        'Автомобили - дополнительная информация', // Заголовок области с мета-полями(title)
        'show_my_avto_metabox', // Вызов(callback)
        'avto_book', // Где будет отображаться наше поле, в нашем случае в разделе Автомобили
        'normal',
        'high');
}
add_action('add_meta_boxes', 'avtobook_meta_box'); // Запускаем функцию

$avto_meta_fields = array(
    array(
        'label' => 'Тип',
        'desc'  => 'Выберите тип.',
        'id'    => 'select_type',
        'type'  => 'select',
        'options' => array (  // Параметры, всплывающие данные
            'one' => array (
                'label' => 'Передний привод',  // Название поля
                'value' => 'Передний привод'  // Значение
            ),
            'two' => array (
                'label' => 'Задний привод',  // Название поля
                'value' => 'Задний привод'  // Значение
            ),
            'three' => array (
                'label' => 'Полный привод',  // Название поля
                'value' => 'Полный привод'  // Значение
            )
        )
    ),
    array(
        'label' => 'Класс',
        'desc'  => 'Выберите класс.',
        'id'    => 'select_class',
        'type'  => 'select',
        'options' => array (  // Параметры, всплывающие данные
            'one' => array (
                'label' => 'Седан',  // Название поля
                'value' => 'Седан'  // Значение
            ),
            'two' => array (
                'label' => 'Универсал',  // Название поля
                'value' => 'Универсал'  // Значение
            ),
            'three' => array (
                'label' => 'Пикап',  // Название поля
                'value' => 'Пикап'  // Значение
            )
        )
    ),
    array(
        'label' => 'Тип КПП',
        'desc'  => '',
        'id'    => 'order', // даем идентификатор.
        'type'  => 'text'  // Указываем тип поля.
    ),
    array(
        'label' => 'Объем ДВС',
        'desc'  => '',
        'id'    => 'kind',  // даем идентификатор.
        'type'  => 'text'  // Указываем тип поля.
    ),
        array(
       'name'  => 'Image',
       'label' => 'Логотип',
       'desc'  => '',
       'id'    => 'image',
       'type'  => 'image'
    ),
       array(
        'label' => 'Производится или нет',
        'desc'  => '',
        'id'    => 'lost',
        'type'  => 'select',
        'options' => array (  // Параметры, всплывающие данные
            'one' => array (
                'label' => 'Производится',  // Название поля
                'value' => 'Производится'  // Значение
            ),
            'three' => array (
                'label' => 'Снят с производства',  // Название поля
                'value' => 'Снят с производства'  // Значение
            )
        )
    ),
        array(
        'label' => 'Дата',
        'desc'  => 'Дата начала производства.',
        'id'    => 'date',
        'type'  => 'date'
    ), 
);

function show_my_avto_metabox() {
global $avto_meta_fields; // Обозначим наш массив с полями глобальным
global $post;  // Глобальный $post для получения id создаваемого/редактируемого поста
// Выводим скрытый input, для верификации. Безопасность прежде всего!
echo '<input type="hidden" name="custom_meta_box_nonce" value="'.wp_create_nonce(basename(__FILE__)).'" />';

    // Начинаем выводить таблицу с полями через цикл
    echo '<table class="form-table">';
    foreach ($avto_meta_fields as $field) {
        // Получаем значение если оно есть для этого поля
        $meta = get_post_meta($post->ID, $field['id'], true);
        // Начинаем выводить таблицу
        echo '<tr>
                <th><label for="'.$field['id'].'">'.$field['label'].'</label></th>
                <td>';
                switch($field['type']) {
                    // Текстовое поле
                    case 'text':
                       echo '<input type="text" name="'.$field['id'].'" id="'.$field['id'].'" value="'.$meta.'" size="30" />
                           <br /><span class="description">'.$field['desc'].'</span>';
                    break;
                    // Список
                    case 'select':
                       echo '<select name="'.$field['id'].'" id="'.$field['id'].'">';
                       foreach ($field['options'] as $option) {
                           echo '<option', $meta == $option['value'] ? ' selected="selected"' : '', ' value="'.$option['value'].'">'.$option['label'].'</option>';
                       }
                       echo '</select><br /><span class="description">'.$field['desc'].'</span>';
                    break;
                    case 'image':
                    $image = WP_PLUGIN_URL.'/image.png';
                    echo '<span class="custom_default_image" style="display:none">'.$image.'</span>';
                    if ($meta) { $image = wp_get_attachment_image_src($meta, 'medium'); $image = $image[0]; }
                    echo    '<input name="'.$field['id'].'" type="hidden" class="custom_upload_image" value="'.$meta.'" />
                    <img src="'.$image.'" class="custom_preview_image" alt="" /><br />
                    <input class="custom_upload_image_button button" type="button" value="Выберите изображение" />
                    <small> <a href="#" class="custom_clear_image_button">Убрать изображение</a></small>
                    <br clear="all" /><span class="description">'.$field['desc'].'</span>';
                    break;
                    case 'date':
                       echo '<input type="date" name="'.$field['id'].'" id="'.$field['id'].'" value="'.$meta.'" size="30" />
                           <br /><span class="description">'.$field['desc'].'</span>';
                    break;                 
                }
        echo '</td></tr>';
    }
    echo '</table>';
}

function save_my_avto_meta_fields($post_id) {
    global $avto_meta_fields;  // Массив с нашими полями

    // проверяем наш проверочный код
    if (!wp_verify_nonce($_POST['custom_meta_box_nonce'], basename(__FILE__)))
        return $post_id;
    // Проверяем авто-сохранение
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
        return $post_id;
    // Проверяем права доступа
    if ('avto_book' == $_POST['post_type']) {
        if (!current_user_can('edit_page', $post_id))
            return $post_id;
        } elseif (!current_user_can('edit_post', $post_id)) {
            return $post_id;
    }

    // Если все отлично, прогоняем массив через foreach
    foreach ($avto_meta_fields as $field) {
        $old = get_post_meta($post_id, $field['id'], true); // Получаем старые данные (если они есть), для сверки
        $new = $_POST[$field['id']];
        if ($new && $new != $old) {  // Если данные новые
            update_post_meta($post_id, $field['id'], $new); // Обновляем данные
        } elseif ('' == $new && $old) {
            delete_post_meta($post_id, $field['id'], $old); // Если данных нету, удаляем мету.
        }
    } // end foreach
}
add_action('save_post', 'save_my_avto_meta_fields'); // Запускаем функцию сохранения
 
Последнее редактирование:
Скрипт для подгрузки картинок в доп полях

Код:
    jQuery(function(jQuery) {

           jQuery('.custom_upload_image_button').click(function() {
                formfield = jQuery(this).siblings('.custom_upload_image');
                preview = jQuery(this).siblings('.custom_preview_image');
                tb_show('', 'media-upload.php?type=image&TB_iframe=true');
                window.send_to_editor = function(stuff) {
                        //console.log(stuff);
                        var data = jQuery(stuff).filter('img');
                        //console.log(data);
                        imgurl = data.attr("src");
                        //console.log(imgurl);
                        classes = data.attr("class");
                        //console.log(classes);
                        id = classes.replace(/(.*?)wp-image-/, '');
                        formfield.val(id);
                        preview.attr('src', imgurl);
                        tb_remove();
                }
                return false;
        });
    
       jQuery('.custom_clear_image_button').click(function() {
        var defaultImage = jQuery(this).parent().siblings('.custom_default_image').text();
        jQuery(this).parent().siblings('.custom_upload_image').val('');
        jQuery(this).parent().siblings('.custom_preview_image').attr('src', defaultImage);
        return false;
        });
    });
 
Последнее редактирование:
Практически все типы полей которые можно вставить
Код:
switch($field['type']) {
// Текстовое поле
case 'text':
    echo
    '<input type="text" name="'.$field['id'].'" id="'.$field['id'].'" value="'.$meta.'" size="30" />
    <br />
    <span class="description">'.$field['desc'].'</span>';
break;
// TEXTAREA
case 'textarea':
    echo
    '<textarea name="'.$field['id'].'" id="'.$field['id'].'" cols="60" rows="4">'.$meta.'</textarea>
    <br />
    <span class="description">'.$field['desc'].'</span>';
break;
//Checkbox
case 'checkbox':
    echo
    '<input type="checkbox" name="'.$field['id'].'" id="'.$field['id'].'" ',$meta ? ' checked="checked"' : '','/>
    <label for="'.$field['id'].'">'.$field['desc'].'</label>';
break;
// Всплывающий список
case 'select':
    echo
    '<select name="'.$field['id'].'" id="'.$field['id'].'">';
    foreach ($field['options'] as $option) {
        echo '<option', $meta == $option['value'] ? ' selected="selected"' : '', ' value="'.$option['value'].'">'.$option['label'].'</option>';
    }
    echo '</select><br /><span class="description">'.$field['desc'].'</span>';
break;
//Изображение
case 'image':
    $image = get_template_directory_uri().'/images/image.png';
    echo '<span class="custom_default_image" style="display:none">'.$image.'</span>';
    if ($meta) { $image = wp_get_attachment_image_src($meta, 'medium'); $image = $image[0]; }            
    echo  
    '<input name="'.$field['id'].'" type="hidden" class="custom_upload_image" value="'.$meta.'" />
    <img src="'.$image.'" class="custom_preview_image" alt="" /><br />
    <input class="custom_upload_image_button button" type="button" value="Выберите изображение" />
    <small> <a href="#" class="custom_clear_image_button">Убрать изображение</a></small>
    <br clear="all" /><span class="description">'.$field['desc'].'</span>';
break;
//Файл
case 'file':      
    echo
    '<input name="'.$field['id'].'" type="hidden" class="custom_upload_file" value="'.$meta.'" />
    <a href="'.$meta.'" class="custom_file_prev">'.$meta.'</a><br />
    <input class="custom_upload_file_button button" type="button" value="Выберите файл" />
    <small> <a href="#" class="custom_clear_file_button">Убрать файл</a></small>
    <br clear="all" /><span class="description">'.$field['desc'].'</span>';
break;
}
 
Последнее редактирование:
Wildcdu, что-то ты в ТС объемный код дал. Может у тебя там всё как положено, но я обычно коротким пользуюсь и хватает. Для меня самый оптимальный:
PHP:
add_action('init', 'my_custom_test_drive');
function my_custom_test_drive()
{
  $labels = array(
    'name' => 'Тест-драйвы', // Основное название типа записи
    'singular_name' => 'Тест-драйв', // отдельное название записи типа для меню
    'add_new' => 'Добавить новый',
    'add_new_item' => 'Добавить новый тест-драйв',
    'edit_item' => 'Редактировать тест-драйв',
    'new_item' => 'Новый тест-драйв',
    'view_item' => 'Посмотреть тест-драйв',
    'search_items' => 'Найти тест-драйв',
    'not_found' =>  'Тест-драйв не найден',
    'not_found_in_trash' => 'В корзине тест-драйвов не найдено',
    'parent_item_colon' => '',
    'menu_name' => 'Тест-драйвы'

  );
  $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'query_var' => true,
    'rewrite' => true,
    'capability_type' => 'post',
    'has_archive' => true,
    'hierarchical' => false,
    'menu_position' => 4,
    'menu_icon' => 'dashicons-book',
    'supports' => array('title','editor','author','thumbnail')
  );
  register_post_type('test-drive',$args);
}
 
Так там не просто добавить мета поля, там меню отдельное, категории свои, и плюс любой вид мета можно использовать (поля, чекбоксы, картинки, списки выпадающие... я только не вставлял подгрузку доков например *.doc, *.pdf)
 
🙂 Это понятно, но это совсем другая история, хоть и связанная. Это уже создание таксономии и доп. полей для пользовательских типов постов.
 
🙂 Это понятно, но это совсем другая история, хоть и связанная. Это уже создание таксономии и доп. полей для пользовательских типов постов.
Ну да, наверное переименовать тему надо
 
Хотя если разнести на блоки скрипт то получится тоже самое что ты написал, нюансы отличий будут конечно, но в целом это стандарт WP. 🙂
 
Назад
Сверху