Close
k

Projects

Contact

News

Let's connect

Создание Plugin для WordPress часть 2. Создание Custom Post type и Carbone Fields для страницы авто.

В этой статье мы рассмотрим, как создавать Custom Post Type, Custom Taxonomy, и поля для страницы Авто.

Создание Custom Post Type

Открываем наш класс AddCPT.php

Первое что нам нужно добавить в функцию init

add_action( 'init', [ $this, 'register_post_auto' ] );

Первый параметр отвечает за то, когда будет вызвана наша функция. Дальше нам нужно передать массив параметров первый из них $this это экземпляр нашего класса, который указывает, где искать нашу функцию, дальше идет имя функции.  

Теперь нам нужно создать функцию, которая будет регистрировать наш новый тип записи Авто.  Для этого нам нужно вызвать функцию register_post_type и передать ему следующие параметры

Вот код нашей функции

/**
 * Register CPT Auto.
 *
 * @return void
 */
public function register_post_auto(): void {
   register_post_type(
      'cars',
      [
         'label'         => null,
         'labels'        => [
            'name'               => __( 'Cars', 'ease-car-listing' ),
            'singular_name'      => __( 'Car', 'ease-car-listing' ),
            'add_new'            => __( 'Add car', 'ease-car-listing' ),
            'add_new_item'       => __( 'Adding a car', 'ease-car-listing' ),
            'edit_item'          => __( 'Car editing', 'ease-car-listing' ),
            'new_item'           => __( 'New car', 'ease-car-listing' ),
            'view_item'          => __( 'View car', 'ease-car-listing' ),
            'search_items'       => __( 'Search car', 'ease-car-listing' ),
            'not_found'          => __( 'Not found', 'ease-car-listing' ),
            'not_found_in_trash' => __( 'Not found in cart', 'ease-car-listing' ),
            'menu_name'          => __( 'Cars', 'ease-car-listing' ),
         ],
         'description'   => '',
         'public'        => true,
         'show_in_rest'  => null,
         'rest_base'     => null,
         'menu_position' => 30,
         'menu_icon'     => 'dashicons-car',
         'hierarchical'  => false,
         'supports'      => [ 'title', 'editor', 'thumbnail', 'excerpt', 'custom-fields', 'revisions' ],
         'taxonomies'    => [ 'cars' ],
         'has_archive'   => true,
         'rewrite'       => true,
         'query_var'     => true,
      ]
   );
}

menu_position – позволит нам менять позицию в меню вордпресс

menu_icon – Выводит иконку

supports — Те параметры которые нам нужны [ ‘title’, ‘editor’, ‘thumbnail’, ‘excerpt’, ‘custom-fields’, ‘revisions’ ]

has_archive – Будет ли доступен архив записей

Создание Custom Taxonomy

Добавляем еще один Action в функцию init

add_action( 'init', [ $this, 'register_tax_mark' ] );

Все так же, как и с созданием нового типа записи cоздаем функцию и вызываем функцию и вызываем в ней  register_taxonomy и передаем в нее параметры

/**
 * Register taxonomy mark & models.
 *
 * @return void
 */
public function register_tax_mark(): void {
   register_taxonomy(
      'mark',
      [ 'cars' ],
      [
         'label'             => '',
         'labels'            => [
            'name'              => __( 'Marks & Models', 'ease-car-listing' ),
            'singular_name'     => __( 'Marks & Models', 'ease-car-listing' ),
            'search_items'      => __( 'Search Mark', 'ease-car-listing' ),
            'all_items'         => __( 'All Marks & Models', 'ease-car-listing' ),
            'view_item '        => __( 'View Marks', 'ease-car-listing' ),
            'parent_item'       => __( 'Marks', 'ease-car-listing' ),
            'parent_item_colon' => __( 'Models', 'ease-car-listing' ),
            'edit_item'         => __( 'Edit Marks & Models', 'ease-car-listing' ),
            'update_item'       => __( 'Update Marks & Models', 'ease-car-listing' ),
            'add_new_item'      => __( 'Add New', 'ease-car-listing' ),
            'new_item_name'     => __( 'New Marks & Models', 'ease-car-listing' ),
            'menu_name'         => __( 'Marks & Models', 'ease-car-listing' ),
            'back_to_items'     => __( '← Back to Marks & Models', 'ease-car-listing' ),
         ],
         'description'       => __( 'The main category is the brand of the car, the child category will be the model.', 'ease-car-listing' ),
         'public'            => true,
         'hierarchical'      => true,
         'rewrite'           => true,
         'capabilities'      => [],
         'show_admin_column' => true,
      ] );
}

Так же нам нужно добавить еще одну taxonomy для объёма двигателя я для этого регистрирую еще одну функцию так будет легче в будущем отключать или редактировать таксономии.  И так делаем все по аналогии

/**
 * Register taxonomy engine.
 *
 * @return void
 */
public function register_tax_engine(): void {
   register_taxonomy(
      'engine',
      [ 'cars' ],
      [
         'label'             => '',
         'labels'            => [
            'name'              => __( 'Engine', 'ease-car-listing' ),
            'singular_name'     => __( 'Engine', 'ease-car-listing' ),
            'search_items'      => __( 'Search Engine', 'ease-car-listing' ),
            'all_items'         => __( 'All Engine', 'ease-car-listing' ),
            'view_item '        => __( 'View Engine', 'ease-car-listing' ),
            'parent_item'       => __( 'Parens Engine', 'ease-car-listing' ),
            'parent_item_colon' => __( 'Parent', 'ease-car-listing' ),
            'edit_item'         => __( 'Edit Engine', 'ease-car-listing' ),
            'update_item'       => __( 'Update Engine', 'ease-car-listing' ),
            'add_new_item'      => __( 'Add New', 'ease-car-listing' ),
            'new_item_name'     => __( 'New Engine', 'ease-car-listing' ),
            'menu_name'         => __( 'Engine', 'ease-car-listing' ),
            'back_to_items'     => __( '← Back to Engine', 'ease-car-listing' ),
         ],
         'description'       => '',
         'public'            => true,
         'hierarchical'      => true,
         'rewrite'           => true,
         'capabilities'      => [],
         'show_admin_column' => true,
      ] );
}

Вот полный код нашего файла: https://gitlab.com/AlsconWeb/ease-car-listing/-/blob/25ed13774bf667a8cb553a947be13cda08a403c7/src/php/CPT/AddCPT.php

Создание полей для нашего типа записи авто

Мы переходим к файлу CarboneFields.php

Первым делом нам нужно инициализировать основной класс Carbone Fields что бы он загрузил все свои классы.

В функцию init добавляем action

add_action( 'after_setup_theme', [ $this, 'carbon_fields_init' ] ); 

Нам нужно выполнить эту функцию на хук after_setup_theme и все что нам нужно выполнить в этой функции это запустить статичный функцию Boot

Carbon_Fields::boot();

код нашей функции:

/**
 * Carbone field init.
 *
 * @return void
 */
public function carbon_fields_init(): void {
   Carbon_Fields::boot();
}

Теперь мы можем добавить сами поля для этого нам нужен action от carbon fields carbon_fields_register_fields

add_action( 'carbon_fields_register_fields', [ $this, 'add_carbone_fields_to_cars' ] );

Создаем данную функцию и начинаем создавать поля. Для создания полей в первую очередь нам нужно создать контейнер вот так

Container::make( 'post_meta', __( 'Vehicle parameters', 'ease-car-listing' ) )

Первый параметр указываем тип контейнера второй параметр его имя

Дальше нам нужно указать, а где выводить эти поля, для этого нам нужно использовать функцию where где первый параметр может быть post_format, post_id, post_level, post_parent_id, post_ancestor_id, post_template, post_term, post_type

Второй параметр отвечает за то как сравнивать параметры и может принимать значение '=''!=''>''>=''<''<=''IN''NOT IN''CUSTOM' Более подробно о этих параметрах вы можете прочитать в документации к CarboneFields.

В нашем случае мы будем использовать post_type и укажем наш название нашего пост записи

->where( 'post_type', '=', 'cars' )

Я буду использовать табы что бы разделить разные виды полей поэтому буду использовать функцию add_tab у нее есть 2 параметра. Первый это имя таба которое выводится на фронт и второй параметр — это массив полей carbon fields.

Итак, полный код это функции вышел у меня такой. Если у вас возникли вопросы вы всегда можете задать вопрос в комментариях под видео.

/**
 * Add Carbon fields to CPT cars
 *
 * @return void
 */
public function add_carbone_fields_to_cars(): void {
   Container::make( 'post_meta', __( 'Vehicle parameters', 'ease-car-listing' ) )
            ->where( 'post_type', '=', 'cars' )
            ->add_tab(
               __( 'General', 'ease-car-listing' ),
               [
                  Field::make( 'text', 'ecl_vin', __( 'Vin number', 'ease-car-listing' ) )->set_width( 50 ),
                  Field::make( 'text', 'ecl_stock_number', __( 'Stock number', 'ease-car-listing' ) )
                       ->set_width( 50 ),
                  Field::make( 'text', 'ecl_car_mileage', __( 'Сar mileage', 'ease-car-listing' ) )
                       ->set_width( 50 ),
                  Field::make( 'select', 'ecl_body_type', __( 'Body type', 'ease-car-listing' ) )
                       ->add_options(
                          [
                             'compact'      => __( 'Compact', 'ease-car-listing' ),
                             'sedan'        => __( 'Sedan', 'ease-car-listing' ),
                             'coupe'        => __( 'Coupe', 'ease-car-listing' ),
                             'hatchback'    => __( 'Hatchback', 'ease-car-listing' ),
                             'kombi'        => __( 'Kombi', 'ease-car-listing' ),
                             'limousine'    => __( 'Limousine', 'ease-car-listing' ),
                             'microvan'     => __( 'Microvan', 'ease-car-listing' ),
                             'minivan'      => __( 'Minivan', 'ease-car-listing' ),
                             'pickup'       => __( 'Pickup', 'ease-car-listing' ),
                             'roadster'     => __( 'Roadster', 'ease-car-listing' ),
                             'suv'          => __( 'SUV', 'ease-car-listing' ),
                             'wagon'        => __( 'Wagon', 'ease-car-listing' ),
                             'pickup_track' => __( 'Pickup track', 'ease-car-listing' ),
                             'van'          => __( 'Van', 'ease-car-listing' ),
                          ]
                       )->set_width( 50 ),
                  Field::make( 'select', 'ecl_fuel_type', __( 'Fuel type', 'ease-car-listing' ) )
                       ->add_options(
                          [
                             'gas'      => __( 'Gas', 'ease-car-listing' ),
                             'diesel'   => __( 'Diesel', 'ease-car-listing' ),
                             'electric' => __( 'Electric', 'ease-car-listing' ),
                          ]
                       )->set_width( 50 ),
                  Field::make( 'text', 'ecl_car_year', __( 'Vehicle year', 'ease-car-listing' ) )
                       ->set_width( 50 ),
                  Field::make( 'text', 'ecl_horsepower', __( 'Vehicle Horsepower', 'ease-car-listing' ) )
                       ->set_width( 50 )
                       ->set_attribute( 'type', 'number' ),
                  Field::make( 'text', 'ecl_body_color', __( 'Body color', 'ease-car-listing' ) )
                       ->set_width( 50 ),
                  Field::make( 'text', 'ecl_interior_color', __( 'Interior color', 'ease-car-listing' ) )
                       ->set_width( 50 ),
                  Field::make( 'text', 'ecl_number_of_airbags', __( 'Number of airbags', 'ease-car-listing' ) )
                       ->set_width( 50 )
                       ->set_attribute( 'type', 'number' ),
                  Field::make( 'text', 'ecl_number_of_seats', __( 'Number of seats', 'ease-car-listing' ) )
                       ->set_width( 50 )
                       ->set_attribute( 'type', 'number' ),
                  Field::make( 'text', 'ecl_number_of_doors', __( 'Number of doors', 'ease-car-listing' ) )
                       ->set_width( 50 )
                       ->set_attribute( 'type', 'number' ),
               ]
            )
            ->add_tab(
               __( 'Additional Information', 'ease-car-listing' ),
               [
                  Field::make( 'rich_text', 'ecl_additional_info', __( 'Additional Information', 'ease-car-listing' ) ),
               ]
            )
            ->add_tab(
               __( 'Gallery', 'ease-car-listing' ),
               [
                  Field::make( 'media_gallery', 'ecl_gallery', __( 'Gallery', 'ease-car-listing' ) )
                       ->set_type(
                          [
                             'image',
                             'video',
                          ]
                       ),
               ]
            )
            ->add_tab(
               __( 'Price', 'ease-car-listing' ),
               [
                  Field::make( 'text', 'ecl_price', __( 'Price', 'ease-car-listing' ) )->set_width( 30 ),
                  Field::make( 'text', 'ecl_sales_price', __( 'Sales price', 'ease-car-listing' ) )
                       ->set_width( 30 ),
                  Field::make( 'text', 'ecl_by_month', __( 'Price per month', 'ease-car-listing' ) )
                       ->set_width( 30 ),
               ]
            );
}

Код всего файла вы всегда можете найти тут: https://gitlab.com/AlsconWeb/ease-car-listing/-/commit/ee77a1cb22d2135f5bbeccdf26f9d37fb934b7c0#9ef8bcfcbdaab0d19e056f80ce0cc3d3c362c61f

Post a Comment