Власні типи записів у WordPress (v. > 3.0)

Хвалили цю можливість, хвалили, а мануалів шось ніде нема. Тому я вирішив розібратися самостійно.

Отже, всі, хто юзає версію WordPress не нижчу за 3.0, тепер мають змогу:

– створювати власні типи записів та програмувати для них власні типи полів (наприклад, окрім просто постів і сторінок, можна створити свій тип контенту “Товари” з власними полями, скажімо, “Розміри”, “Колір”, “Ціна” тощо. Хоча в останній можливості, по суті, нічого нового – це давно знайомі нам custom fields, от тільки працювати з ними тепер можна приємніше, “замаскувавши” під дефолтні поля запису)

– створювати для цих записів окремі таксономічні зв’язки. Скажімо, якщо ви створили тип запису “Фільми”, то ви можете створити окрему таксономію для цих записів, де те, що ми звикли називати рубриками чи категоріями, називатиметься акторами. Аналог тегів можна використати для позначення років релізу фільмів. Але, чесно кажучи, питання таксономії – не таке просте, і я з ним ще не розібрався в достатньому мірі, тому в даному огляді ми його не розглядатимемо.

Але перейдемо до практики… Я давно мріяв створити власну базу даних географічних точок, так званих waypoints – це якісь цікаві місця, які я відвідав, маючи з собою GPS, та відмітив їх. І було б непогано самими цікавими точками поділитися з іншими! Тож, почнемо!

Створюємо новий тип запису “Точки” (додаючи код, що нижче, у файл funсtions.php вашої теми):

add_action('init', 'waypoint_register');

    function waypoint_register() {
        $args = array(
/* опис усіх параметрів: http://codex.wordpress.org/Function_Reference/register_post_type */
            'label' => __('Точки'),
            'singular_label' => __('Точка'),
            'public' => true,
            'show_ui' => true,
            'capability_type' => 'post', //права такі ж, як у постів
            'hierarchical' => false, // не активувати ієрахічну структуру
            'rewrite' => true, // пермалінки
                'menu_position' => 6, // позиція в меню
                'menu_icon' => get_stylesheet_directory_uri() . '/images/super-duper.png', //іконка блоку
            'supports' => array('title', 'excerpt', 'thumbnail')
/* Перелік стандартних полів, які будуть активовані в новому типу записів.
Про стандартні типи полів: http://codex.wordpress.org/Function_Reference/add_post_type_support */
        );

        register_post_type( 'point' , $args );
    }

Тепер зазирнемо в адмінку… З’явилося? 🙂

Я так собі подумав і вирішив, що кожна точка має мати такі характеристики:
– назву
– опис
– широту
– довготу
– зображення
– ключ іконки (на всякий випадок, якщо захочемо виводити точки на карті і позначати кожну точку різними іконками)

Отже, якщо ви уважно проглянули вищенаведений код, то помітили, що для нового типу записів ми залишили зі стандартних вордпресівських полів заголовок, цитату і прев’ю-зображення запису (параметр supports).

Тепер робимо тако:

add_filter("manage_edit-point_columns", "point_edit_columns");
add_action("manage_posts_custom_column",  "point_custom_columns");


// які колонки буде видно в переліку записів
function point_edit_columns($columns){
        $columns = array(
            "title" => "Назва точки",
            "LAT" => "Широта",
                        "LON" => "Довгота",
           
        );

        return $columns;
}

function point_custom_columns($column){
        global $post;
        switch ($column)
        {
/* задаємо типи полів для запису та custom-fields, які будуть за них відповідати */
            case "description":
                the_excerpt();
                break;
            case "LAT":
                $custom = get_post_custom();
                echo $custom["LAT"][0];
                break;
            case "LON":
                $custom = get_post_custom();
                echo $custom["LON"][0];
                break;
                        case "ICON":
                $custom = get_post_custom();
                echo $custom["ICON"][0];
                break;
        }
}
?>

Вищенаведеним кодом ми вказали, які колонки (характеристики точки) відображати при перегляді списку записів даного типу в адмінці та вказали “нестандартним” полям, де вони мають брати дані (в даному випадку – в полі excerpt та в custom fields).

Новий тип запису - Точки (points). Зверніть увагу на колонки!

Далі налаштуємо зберігання наших даних та вивід полів запису на сторінці створення запису в адмінці:

ID);
        $LAT = $custom["LAT"][0];
        $LON = $custom["LON"][0];
        $ICON = $custom["ICON"][0];

?>
<!-- Виводимо поля в адмінці на сторінці створення запису -->
<table class="widefat">
<tbody>
<tr>
<td><label>Широта:</label></td><td>&lt;input name=&quot;LAT&quot; value=&quot;" /&gt;</td></tr>
<td><label>Довгота:</label></td><td>&lt;input name=&quot;LON&quot; value=&quot;" /&gt;</td></tr>
<td><label>Іконка:</label></td><td>&lt;input name=&quot;ICON&quot; value=&quot;" /&gt;</td></tr>
</tbody>
</table>



ID, "LAT", $_POST["LAT"]);
        update_post_meta($post-&gt;ID, "LON", $_POST["LON"]);
    update_post_meta($post-&gt;ID, "ICON", $_POST["ICON"]);
}
?&gt;

В результаті, маємо:

Створення нового custom-типного запису

Отже, ми начилися створювати нові типи записів, задавати поля для них та виводити ці поля в адмінці. Тепер можна додавати пости нового типу. Але, оскільки наші записи нового типу відрізняються від стандартних, то виводитися нормально серед постів звичайного типу вони не будуть. Що ж робити? А про це я розкажу настуного разу, коли у мене буде натхення 🙂

  • Гарна стаття! Я дещо від себе ще додам і передрукую на wordpress.co.ua
    Ти не проти?

    • Та будь-ласка! Посилання на оригінальну статтю і щоб було видно де твій текст, а де мій – і всі задоволені 🙂

  • А наша Галя балувана 🙂 (Жартую…)
    Юрко мене випередив… але, я думаю, теж дещо додам выд себе на wordpress.co.ua