Пълно ръководство за персонализирани типове публикации в WordPress. Персонализиран тип публикация в WordPress - register_post_types, register_taxonomy В какви случаи трябва да създадете персонализиран тип публикация?

$post_type ( линия) това, което искате да назовете вашия тип публикация, това име ще се използва в параметрите на много функции в бъдеще, имайте това предвид. В допълнение, следните думи, запазени от WordPress, не могат да се използват като заглавия:

  • прикачен файл
  • ревизия
  • нав_меню_елемент
  • custom_css
  • customize_changeset
  • действие
  • поръчка
  • тема
  • автор
$args ( масив) включва следните параметри: етикети ( масив) ви позволява да подписвате елементи на интерфейса от даден тип публикация. Повече подробности в примера в края на публикацията. описание( линия) описание на типа запис, който се регистрира. Доколкото ми е известно, тази настройка не се използва никъде в двигателя на WordPress или в стандартните добавки и теми. Но може да се използва в плъгини или теми на трети страни. публичен ( логично) обобщава следващите няколко параметъра, като ги задава на съответните им стойности по подразбиране public_queryable ( логично) дали елементи от този тип публикации трябва да бъдат предоставени на сайта. Прочетете повече за предназначението на този параметър.
По подразбиране: публична стойност на аргумента. изключване_от_търсене( логично)
  • true — изключване на записи от този тип от резултатите от търсенето в сайта,
  • невярно - не изключвайте.

По подразбиране: противоположни стойности на публичния параметър. show_in_nav_menus( логично) дали елементи от този тип публикации трябва да бъдат предоставени за добавяне към менюто на сайта.
По подразбиране: публична стойност на аргумента. show_ui( логично) дали е необходимо да се добави стандартен интерфейс в админ панела за редакция и добавяне на записи от този тип.
По подразбиране: публична стойност на аргумента.

Покажи_в_меню ( логично|линия) дали е необходимо да се добавят елементи към администраторското меню.

По подразбиране: стойност на аргумента show_ui. show_in_admin_bar ( логично) дали е необходимо да се добави линк за създаване на нов запис от този тип в админ панела.

По подразбиране: стойност на аргумента show_in_menu. menu_position( цяло число) ред на подреждане в менюто в админ панела.

икона_меню( линия) абсолютен URL адрес на иконата за менюто. Оптималната разделителна способност на изображението е 16x16 пиксела.

В допълнение, WordPress 3.8 въведе вграден пакет с икони - можете да използвате всяка от тези икони, като просто посочите нейното име като стойност на параметър, например dashicons-cart.

По подразбиране се използва иконата за обикновени публикации. delete_with_user( логично) при изтриване на потребител в блог, трябва ли всички записи от този тип, които той е публикувал, да бъдат изтрити автоматично.
По подразбиране: невярно. йерархичен ( логично) дали този тип длъжност трябва да има йерархия.
По подразбиране: невярно. има_архив( логично|линия) дали този тип публикации трябва да имат собствена страница с архиви. Можете да посочите пряк път към страницата с архивите като стойност на параметъра.
По подразбиране: невярно. нова редакция ( масив|логично) задава правила за постоянни връзки в URL адреси. Ако зададете false като стойност на този параметър, няма да бъдат създадени правила за постоянни връзки.

плужек ( линия) етикет, използван за публикации от този тип (по подразбиране е името на типа публикация) with_front ( логично) дали да се добави стойността $wp_rewite->front към постоянни връзки (по подразбиране - вярно) емисии ( логично) дали е необходимо да се създаде RSS канал за този тип публикации (по подразбиране - стойността на параметъра has_archive) страници ( логично) трябва ли да се позволи пагиниране в публикации от регистриран тип с помощта на етикета(по подразбиране е вярно) поддържа ( масив), които трябва да се добавят към страниците за редактиране на записи от този тип.

  • title - поле за въвеждане на заглавие на публикацията
  • редактор - текстов редактор
  • откъс — метакутия „Цитат“.
  • автор — метакутия „Автор“.
  • миниатюра - метабокс „Публикуване на миниатюра“ (в допълнение, вашата тема трябва да ги поддържа)
  • коментари — метабокс „Коментари“ (ако е посочено, коментарите на публикации от регистриран тип са разрешени)
  • обратни връзки — метабокс „Изпращане на обратни връзки“
  • персонализирани полета — метабокс „Персонализирани полета“ (персонализираните полета ще се поддържат при всички случаи)
  • ревизии — метабокс „Ревизии“ (ако е посочено, ревизиите на публикации от този тип ще бъдат създадени в базата данни)
  • page-attributes - метабокс „Атрибути на страница“ с възможност за избор на родителски елемент и задаване на реда menu_order
  • пост-формати - метабокс “Форматиране”, прочетете повече за пост форматите.
  • таксономии ( масив) масив от таксономии, като категория или post_tag, които да се използват за този тип публикации. Можете също да зададете таксономии с помощта на функцията.

    Пример за регистрация на тип публикация

    Ако не знаете къде да вмъкнете кода, поставете го във functions.php на текущата си тема.

    add_action ("init", "true_register_products"); // Използвайте функцията само вътре в init кукатафункция true_register_products() ( $labels = масив ( "name" => "Продукти" , "singular_name" => "Продукт" , // админ панел Add->Function"add_new" => "Добавяне на продукт" , "add_new_item" => „Добавяне на нов продукт“, // заглавие на етикета </span>"edit_item" => <span>„Редактиране на продукт“</span>, "new_item" => "Нов продукт" , "all_items" => "Всички продукти" , "view_item" => <span>„Вижте продуктите в сайта“</span>, "search_items" => "Търсене на продукти" , "not_found" => <span>„Няма намерени продукти.“</span>, "not_found_in_trash" => <span>„Няма артикули в количката.“</span>, "menu_name" => "Продукти" <span>// връзка в менюто в админ панела</span>) ; $args = масив ("labels" => $labels, "public" => true, <span>// благодарение на това някои параметри могат да бъдат пропуснати</span>"menu_icon" => "dashicons-cart" , <span>// икона на количка</span>"menu_position" => 5 , "has_archive" => true , "supports" => array ( "title" , "editor" , "excerpt" , "thumbnail" , "comments") , "taxonomies" => array ( " post_tag" ) ); register_post_type("продукт",$args); )</td> </tr></table><p><span class="koXPsjWcBis"></span></p></ul> <p>Създайте персонализиран тип публикация <b>Статии</b>с персонализирани категории (персонализирана таксономия) <b>Категория статии</b>.</p><p>В моя случай всички стандартни записи са продукти, така че ще показваме статии чрез персонализирани записи.</p><p>Във файла с функции functions.php ние регистрираме потребителски тип публикация Статии:</p><p>Функция wptp_create_post_type() ( $labels = array("име" => __("Статии"), "singular_name" => __("Статии"), "add_new" => __("Нова статия"), "add_new_item" => __("Добавяне на нова статия"), "edit_item" => __("Редактиране на статия"), "new_item" => __("Нова статия"), "view_item" => __("Преглед на статия"), "search_items" => __("Търсене на статии"), "not_found" => __("Няма намерени статии"), "not_found_in_trash" => __("Няма намерени статии в кошчето"), "етикети" => $labels, "has_archive" => true, "public" => true, "hierarchical" => false, "menu_position" => 5, "supports" => array("title", "editor" , "excerpt", "custom-fields", "thumbnail"),); register_post_type("articles", $args ) add_action("init", "wptp_create_post_type");</p><p>Ако искате стандартните категории да се показват в персонализирани публикации, свържете ги с таксономията на категориите:</p><p>"таксономии" => масив ("категория"),</p><p>Ако създавате и персонализирани таксономии за персонализирани публикации, тогава трябва да ги свържете със създадените таксономии; ако вземем примера по-долу, това ще бъде articles_category</p><p>"таксономии" => масив ("категория_статии"),</p><p>След това, за персонализирания тип публикация Статии, регистрираме таксономиите „Категория на статията“, така че различните публикации да могат да принадлежат към различни категории.</p><p>Функция wptp_register_taxonomy() ( register_taxonomy("articles_category", "articles", array("labels" => array("name" => "Категории на статии", "singular_name" => "Категория на статии", "search_items" => " Търсене в категории статии", "all_items" => "Всички категории статии", "edit_item" => "Редактиране на категории статии", "update_item" => "Актуализиране на категория статии", "add_new_item" => "Добавяне на нова категория статии", "new_item_name" => "Ново име на категория на артикула", "menu_name" => "Категория на артикул", "hierarchical" => true, "sort" => true, "args" => array("orderby" => "term_order"), "show_admin_column" => true)); add_action("init", "wptp_register_taxonomy");</p><p>За персонализирана таксономия можете да промените охлюва на по-красив, така че да не е articles_category, но трябва да се уверите, че такива охлюви вече не съществуват на други страници или публикации, в противен случай ще има проблеми:</p><p>"rewrite" => array("slug" => "blog"),</p><p>Когато променяте охлювите, трябва да актуализирате настройките „Постоянни връзки“ в административния панел, в противен случай ще получите грешка 404 вместо желаната страница.</p><p>Още примери можете да намерите тук. Но помогна да подредя целия този код, за което съм много благодарен на автора.</p><p>Файлът single.php е отговорен за външния вид на персонализирана публикация, но за да промените външния вид на персонализирана публикация, можете да създадете файл single-(post_type).php - в моя случай това ще бъде single-articles.php с собственото си съдържание.</p><p>Сега трябва да покажете персонализирани публикации на страницата. По подразбиране файлът index.php отговаря за показването на архива на персонализирани публикации. Но можете да създадете файл, който ще отговаря за показването на потребителски записи във вашата таксономия. <br></p><h2>Вариант 1 е най-правилен. Ние показваме записи в таксономията по същия начин, както в обикновена категория.</h2><p>За да направите това, създайте файл taxonomy-(taxonomy).php - в моя случай това ще бъде taxonomy-articles_category.php и в него показваме обичайния цикъл, както при стандартните записи в категория:</p><p> <div class="container"> <div class="row"> <div class="col-md-12"> <div class="cat-title"><?php single_cat_title(); ?></div> <div class="tax-wrap"> <?php if (have_posts()) : while (have_posts()) : the_post(); get_template_part("include/tax-item"); endwhile; get_template_part("include/pagination"); endif; ?> </div><!-- /tax-wrap --> </div><!-- /col-md-12 --> </div><!-- /row --> </div><!-- /container --> </p><p>Във файла tax-item.php показваме данните, които трябва да получим от всяка публикация, например заглавие, връзка към публикация, миниатюра и извадка.</p><p>Във файла pagination.php показваме пагинацията в този формат.</p><p>Цикълът не се променя, пагинацията работи чудесно. Това е най-добрият вариант за показване на персонализирани таксономии. <br></p><h2>Вариант 2 – ако няма персонализирани таксономии, тогава можете просто да получите всички персонализирани публикации под формата на архив</h2><p>За да направите това, в шаблона създаваме файл archive-(post_type).php - в моя случай това ще бъде archive-articles.php , в който, точно както в таксономията, показваме обикновен цикъл, само вместо Заглавие на таксономията показваме името на персонализирания тип публикация<?php post_type_archive_title(); ??> :</p><p> <div class="container"> <div class="row"> <div class="col-md-12"> <div class="cat-title"><?php post_type_archive_title(); ?></div> <div class="tax-wrap"> <?php if (have_posts()) : while (have_posts()) : the_post(); get_template_part("include/tax-item"); endwhile; get_template_part("include/pagination"); endif; ?> </div><!-- /tax-wrap --> </div><!-- /col-md-12 --> </div><!-- /row --> </div><!-- /container --> </p><p>С тази опция, ако не е създадена архивна страница за персонализирана публикация, тогава можете да получите списък с всички персонализирани публикации, като използвате директната връзка BLOG_URL?post_type=(post_type) или в моя случай http://site.com/ статии/. <br></p><h2>Опция 3. Просто покажете всички персонализирани записи на статии на страница с даден шаблон</h2> <?php $args = array("post_type" =>"статии", "публикации на страница" => -1); $loop = нова WP_Query($args); докато ($loop->have_posts()) : $loop->the_post(); get_template_part("включване/данъчен артикул"); край докато; ?> <p>get_template_part("включване/данъчен артикул"); – във файла tax-item.php показвам съдържанието на публикацията, което ми е необходимо за показване на публикации в цикъла (заглавие, миниатюра, дата, цитат и т.н.)</p><p>Тази опция показва всички статии на страницата, независимо от таксономиите (категориите).</p><p>И ако трябва да покажем всяка категория отделно със собствена новина, тогава използваме първата опция, описана по-горе.</p><p>Като се има предвид това, ако използвате плъгина Yoast SEO и използвате неговите галета:</p><p> <?php if (function_exists("yoast_breadcrumb")) { yoast_breadcrumb(" "); } ?> </p><p>След това, когато изберете таксономията „Категория на статии“ в настройките на плъгина в „Таксономия за показване в навигационни пътеки за типове публикации“, в навигационните точки ще получите връзка към категорията, към която принадлежи новината; с други опции за показване на персонализирани публикации , това не можеше да се направи.</p> <p>Относно персонализирани типове публикации в WordPress (CPT, персонализирани типове публикации в WordPress), как да създавате и конфигурирате, добавяте категории и тагове, как да правите вложени URL адреси /тип публикация/категория/публикация или http://example.com/post_type/ категория/ пост/ . <br>Той също така описва как да разширите стандартната функционалност на WordPress чрез създаване на нови типове публикации, които могат да се използват за различни цели: добавяне на собствено портфолио, филмов и музикален индекс, продуктов каталог, календар на събития, дори създаване на ваш собствен малък онлайн магазин (защото голям е по-добре да използва готови решения като WooCommerce) или социална мрежа, и много други в този дух. <br>Първо обща информация, след това специфика.</p> <h2>Относно публикациите в WordPress: къде се съхраняват в базата данни и как да ги получите</h2> <p>Абсолютно всички публикации в WordPress, които са разгледани по-долу, се съхраняват в една таблица: wp_posts. Метаданните на публикациите, като например данни от метакутии, се съхраняват в таблицата wp_postmeta.</p> <p>Ще дам пример как да получите 10 публикации от тип post (стандартен <b>Публикации</b>в админ панела). <br>Като цяло не е необходимо да се изискват конкретни данни. В шаблоните те вече са предварително инсталирани, например в single.php данните за запис вече са налични за обработка в цикъл</p><p>If (have_posts()) ( while (have_posts()) ( the_post(); // Тук използваме данни от цикъла, като the_title() и т.н.) )</p><p>Ако данните трябва да бъдат получени някъде извън цикъла или шаблона, се използва заявката WP_Query</p><p>$args = array("post_type" => "post", // Тип публикация: страница, прикачен файл, ... "posts_per_page" => 10, // 10 публикации наведнъж); $p = get_posts($args); // Данните могат да бъдат разширени в цикъл if (!empty($p)) ( foreach ($p as $post) ( setup_postdata($post); ?> "><?= the_title() ?> <?php } wp_reset_postdata(); } </p><p>Данните могат да бъдат получени с помощта на SQL заявка:</p><p>Global$wpdb; $query = "SELECT * FROM ($wpdb -> публикации) WHERE post_type = "post" LIMIT 10"; $p = $wpdb -> get_results($query); изход (print_r($p)); // $p сега съдържа масив с публикувани данни</p><p>И трите метода по-горе ще дадат един и същ резултат. <br></p> <h2>Предварително зададени типове публикации в WordPress: публикация, страница, прикачен файл, ревизия, nav_menu_item</h2> <h3>Записи или публикации (публикация)</h3> <p>Най-използваната единица от всички видове, която е в WordPress, е публикации (известни още като публикации). Използва се като публикации в блогове и други подобни. Има 2 предварително зададени таксономии: заглавия, известни също като категории (category) и тагове, известни също като тагове (post_tag). <br>Таксономиите се използват за сортиране и организиране на публикации. <br>Категориите се различават от етикетите по това, че имат дървовидна структура (те могат да бъдат вложени една в друга). <br>Етикетите са единици, независими една от друга и по този начин донякъде приличат на записите. <br>Също така, по подразбиране, RSS емисията на WordPress сайт се генерира от записи.</p> <p>Следните шаблонни файлове се използват за Записи (по ред на приоритет):</p> <ol><li>single-post.php</li> <li>единичен.php</li> <li>единствено.php</li> <li>index.php</li> </ol><blockquote class="note"><p>Файловете с шаблони се търсят отгоре надолу по ред на приоритет. Ако в темата бъде намерен шаблонен файл, той се използва и търсенето се спира.</p> </blockquote> <h3>Страници</h3> <p>Страниците се използват главно като обслужващи страници, целеви страници, целеви страници, енциклопедични колекции и други подобни. Те имат дървовидна йерархия, тоест могат да бъдат вложени един в друг, което ще се отрази в адреса на крайната страница (преките пътища на родителя ще присъстват в URL веригата) и в тази роля е възможно да дайте им приоритет при сортирането. <br>За да създадете целева страница, можете да отидете по два начина: <br></p> <h4>Създайте специален шаблон за страница</h4> <p>Някъде в темата в главната или нейната поддиректория създайте файл с произволно име и разширение php, например landing.php. Вътре можете да поставите абсолютно всеки шаблон, който може да бъде напълно различен от другите страници на сайта. Но най-важното е да поставите този код в началото на файла:</p><p> <?php /* Template Name: Наш уникальный лендинг */ </p><p>Името на шаблона е специален етикет, който казва на WordPress, че този файл е специален шаблон. <br>Сега, когато създавате и редактирате която и да е страница, погледнете в блока вдясно, наречен Атрибути на страницата, в него, в раздела Шаблон, можете да изберете нашата уникална целева страница.</p> <p>За страници се използва следната йерархия на шаблона. Както при записите, посочвам по приоритет:</p> <ol><li>(шаблон).php</li> <li>страница-(етикет_на_страница).php</li> <li>страница-(page_ID)</li> <li>страница.php</li> <li>единствено.php</li> <li>index.php</li> </ol><h3>Прикачени файлове, прикачени файлове или прикачени файлове</h3> <p>Тип помощна програма, предназначена да съхранява информация за файлове (изображения, аудио, видео и други подобни), които са били качени чрез програмата за качване в стандартния редактор на WordPress при редактиране на публикация, страница или други подобни: размер, тегло, описание, коя публикация или страница те са привързани към и подобни неща.</p> <p>Можете да получите прикачени файлове за последващо манипулиране с тях, като използвате следния код:</p><p>$args = array("post_type" => "attachment", // Тип публикация: прикачен файл "post_status" => "inherit", // По подразбиране е "publish" и с него не можете да получавате прикачени файлове, така че посочваме специален статус на прикачен файл " наследяване"); $p = get_posts($args); изход (print_r($p)); // На изхода ще имаме масив с прикачени файлове</p><p>Йерархия на шаблони за прикачени файлове:</p> <ol><li>(тип mime).php</li> <li>(подтип-mime).php</li> <li>(mime-type-subtype).php</li> <li>прикачен файл.php</li> <li>единичен.php</li> <li>единствено.php</li> <li>index.php</li> </ol><h3>Ревизии, чернови или ревизии</h3> <p>Ревизиите, известни също като ревизии, са версии на чернови на публикации, които се създават автоматично, докато пишете статия в административния панел на WordPress или запазвате статия, без всъщност да я публикувате. <br>По време на процеса на писане, за всяка статия, по подразбиране, всяка версия на черновата се записва. Можете да сравните две различни версии и да се върнете към тази, от която се нуждаете. <br>Съхраняването на много версии на една и съща статия е доста скъпо и често безсмислено (въпреки че вероятно би било по-правилно да оставите всичко по подразбиране, като редовно почиствате стари ревизии с помощта на плъгин, например WP Optimize), така че броят на запазените версии на ревизиите може да се промени чрез 2 опции:</p> <ol><li>Използвайте филтър wp_revisions_to_keep</li> <li>Регистрирайте се в wp-config.php //Деактивирайте ревизиите до минималната възможна стойност define("WP_POST_REVISIONS", 0); <p>Възможни стойности:</p> <ul><li>true или -1: Запазва всяка версия на черновата. Опция по подразбиране</li> <li>false или 0: деактивира запазването на чернови, с изключение на 1 автоматично запазване</li> <li>Цяло число, по-голямо от нула: посоченият брой чернови версии се записват + 1 автоматично запазване. Старите версии, които не се вписват в посочения брой, се изтриват автоматично</li> </ul></li> </ol><h3>Елементи от менюто за навигация (nav_menu_item)</h3> <p>Навигационното меню (nav_menu_item) е тип публикация, която съхранява информация за навигационен елемент в WordPress. Първият и засега единствен вид запис, който не се използва като другите видове записи, данните за работа и показване в сайта получават свои отделни функции. <br>Освен това менютата за навигация не са активирани по подразбиране. За да ги активирате, трябва да декларирате поддръжката им в:</p> <ol><li>Напишете add_theme_support("менюта");</li> <li>Или регистрирайте пространство в менюто с помощта на register_nav_menu(), тогава поддръжката на менюто ще бъде активирана автоматично</li> </ol><p>Използвайте wp_nav_menu(), за да получите данните, защото WP_Query няма да работи и това е функция на типа публикация nav_menu_item</p><p>// Този код ще работи wp_nav_menu(); // Ще покаже първото регистрирано непразно меню // Но кодът по-долу няма да работи $args = array("post_type" => "nav_menu_item", // Тип публикация: страница, прикачен файл, ...); $p = get_posts($args); изход (print_r($p)); // Резултатът ще бъде празен масив</p><h2>Персонализиран тип публикация (CPT WordPress)</h2> <p>Сега стигаме до най-важното - инструментът, който ви позволява да разширите стандартната функционалност за блогове на WordPress до безкрайни възможности: персонализиран персонализиран тип публикация. <br>Най-простият пример за това как можете да регистрирате нашата нова публикация тип sheensay_product</p><p>Add_action("init", "sheensay_post_type"); функция sheensay_post_type() ( register_post_type("sheensay_product", array("labels" => array("name" => "Products", "singular_name" => "Products",), "public" => true, // type записите са отворени за търсене и подобни "has_archive" => true, // Разрешаване на архивни страници "supports" => array("title", "editor", "thumbnail", "comments"), // Разрешаване на поддръжка за заглавие, редактор, миниатюри, коментари));</p><p>Тук sheensay_product е името на новия тип публикация. Не трябва да е в конфликт с други в системата; повече за това по-долу. <br>Освен това в това изпълнение той служи като пряк път към този тип публикация, тоест присъства в URL адреса. Ако искате да зададете различен пряк път, например <b>продукти</b>, направете както в примера по-долу</p><p>Add_action("init", "sheensay_post_type"); функция sheensay_post_type() ( register_post_type("sheensay_product", array("labels" => array("name" => "Products", "singular_name" => "Products",), "public" => true, "rewrite" => array("slug" => "products"), // Етикетът Custom Post Type "has_archive" => true, "supports" => array("title", "editor", "thumbnail"),) ; )</p><h3>Как да изберем правилното име за нов тип публикация</h3> <blockquote class="attention"><p>Следните имена са запазени в WordPress и не могат да се използват като име на нов тип публикация:</p> <ul><li>прикачен файл</li> <li>ревизия</li> <li>нав_меню_елемент</li> <li>действие</li> <li>тема</li> <li>поръчка</li> </ul><p>Освен това трябва да избягвате използването на префикса wp_ в началото на името, тъй като това може да причини конфликти с бъдещи версии на ядрото на WordPress. <br>Най-добре е да добавяте към имената произволни префикси, свързани с името на вашия сайт, продукт или марка, например sheensay_product, тогава гарантирано ще избегнете потенциални конфликти</p> </blockquote> <h3>Как да направите персонализирана таксономия</h3> <p>Персонализираните типове публикации могат да използват таксономии от публикации, например категории (категории) или тагове (тагове), но можете да имате свои собствени таксономии.</p><p>Add_action("init", "sheensay_post_type"); function sheensay_post_type() ( // Регистриране на таксономията register_taxonomy("sheensay_product_type", "sheensay_product", array("label" => "Types", "hierarchical" => true, // Ако TRUE, таксономията ще бъде аналогична на заглавията (категории). Ако е FALSE (по подразбиране), тогава таксономията ще стане аналог на таговете "rewrite" => array("slug" => "product-type")); Персонализиран тип публикация) register_post_type ("sheensay_product", array("labels" => array("name" => "Products", "singular_name" => "Products",), "public" => true, "rewrite" = > array("slug " => "products"), // CPT етикетът е дефиниран тук "has_archive" => true, "supports" => array("title", "editor", "thumbnail"), // Активиране на поддръжка за заглавие, редактор, миниатюра ));</p><h3>Шаблони за потребителски типове публикации</h3> <p>Всичко зависи от това какъв вид информация се показва. Може да има 3 опции: конкретен шаблон за публикация, шаблон за архив на публикации и шаблон за таксономия <br></p> <h4>Шаблон за страница за публикуване</h4> <p>Изброени по приоритет</p> <ol><li>единичен-(тип_пост).php</li> <li>единичен.php</li> <li>index.php</li> </ol><h4>Шаблон за архивиране на публикация</h4> <ol><li>архив-(тип_пост).php</li> <li>архив.php</li> <li>index.php</li> </ol><h4>Персонализиран шаблон за таксономия</h4> <ol><li>таксономия-(име_на_таксономия)-(име_на_термин).php</li> <li>таксономия-(име_на_таксономия).php</li> <li>таксономия.php</li> <li>архив.php</li> <li>index.php</li> </ol><p>Тук taxonomy_name е sheensay_product_type, а term_name е етикетът на таксономията, която ще създадете в административния панел.</p> <h3>Как да получите персонализирани данни за тип публикации (Custom Post Type WordPress) и да ги покажете на сайта</h3> <p>Можете да получите персонализирани данни за тип публикации в WordPress за показване на уебсайта си, като използвате същите методи като обикновените публикации и страници</p><p>$args = array("post_type" => "sheensay_product", // Посочете нашия нов тип публикация "posts_per_page" => 10,); $p = get_posts($args); foreach ($p като $post) ( setup_postdata($post); ?> "><?= the_title() ?><br /> <?php } wp_reset_postdata(); ?> </p><p>Ако говорим за основната заявка, за която данните, например, са предварително заредени за показване на главната страница или стандартните архивни страници, тогава произволните типове публикации са деактивирани там. <br>Така че, ако искате всеки създаден тип публикация да се показва на, да речем, архивни страници заедно с обикновените публикации, трябва да промените филтъра за предварително зареждане на публикация</p><p>// Свържете нашия "sheensay_product" със стандартните "post" и "page" add_action("pre_get_posts", "add_sheensay_product_in_main_query"); функция add_sheensay_product_in_main_query($query) ( if (is_archive() && $query -> is_main_query()) $query -> set("post_type", array("post", "page", "sheensay_product")); върне $query ;)</p><h3>Готов клас за създаване на потребителски типове публикации с персонализирана таксономия</h3> <p>По-долу е даден клас, с който можете да регистрирате всеки персонализиран тип публикация със собствена таксономия и URL адресът ще изглежда така <br>http://example.com/products/type/product</p> <blockquote class="note"><p>За да бъде генериран URL адресът, трябва да отидете в настройките за постоянна връзка /wp-admin/options-permalink.php и да зададете всякакви общи настройки, различни от прости</p> <p><img src='https://i0.wp.com/sheensay.ru/wp-content/uploads/2016/08/options-permalink.png' width="100%" loading=lazy loading=lazy></p> </blockquote> <p>По-долу е кодът на самия клас. Не е нужно да правите никакви промени в него, но можете да промените етикета за тип публикация в самия край в реда new Sheensay_Product("products"); <br>Самият код е написан на или на . Първият вариант е за предпочитане, тъй като в този случай няма да загубите достъп до съдържанието на новия тип публикация при промяна на активната тема.</p><p> <??p=1713 * */ final class Sheensay_Product { // Ярлык произвольного типа записи по умолчанию private $post_type = "продукция"; function __construct($post_type = "") { // Переопределяем значение ярлыка по умолчанию if ($post_type) $this -> post_type = $post_type; /* * Регистрирайте потребителски тип публикация */ add_action("init", array($this, "sheensay_cpt_product")); /* * Филтриране на URL адреса */ add_filter("post_type_link", array($this, "product_permalink_structure"), 10, 2); /* * За да работи странирането */ add_action("generate_rewrite_rules", array($this, "fix_product_category_pagination")); ) функция sheensay_cpt_product() ( /* * Регистрирайте персонализирана таксономия за нов тип публикации */ register_taxonomy("sheensay_product_type", "sheensay_product", array("label" => "Types", "hierarchical" => true, "query_var " = > true, "rewrite" => array("slug" => $this -> post_type),)); /* * Регистрирайте нов тип публикация */ $labels = array("name" => "Products" , // Основно име "singular_name" => "Продукти", // Добавяне на "add_new" => "Добавяне на нов", // Име на връзката към новия запис в страничната лента "add_new_item" => "Добавяне на нови продукти" , // Заглавие в редактора при добавяне на нов запис); $args = array("labels" => $labels, "public" => true, "publicly_queryable" => true, "show_ui" => true, "query_var" " => true, "capability_type" = > "post", "hierarchical" => false, "menu_position" => null, "supports" => array("title", "editor", "thumbnail", "excerpt" ), "rewrite" => array( "slug" => $this -> post_type . "/%sheensay_product_type%", "with_front" => false,), "has_archive" => $this -> post_type,); register_post_type("sheensay_product", $args); if (current_user_can("manage_options")) // Бъдете внимателни с тази функция. Нулира всички правила за откриване на URL адреси. По-добре е да го коментирате след приключване на цялата работа flush_rewrite_rules(); ) функция product_permalink_structure($post_link, $post) ( if (FALSE !== strpos($post_link, "%sheensay_product_type%")) ( $product_type_term = get_the_terms($post -> ID, "sheensay_product_type"); if (!empty ($product_type_term)) $post_link = str_replace("%sheensay_product_type%", $product_type_term -> slug, $post_link;) function fix_product_category_pagination($wp_rewrite) ( unset($wp_rewrite -> rules[ $this - >) post_type. "/([^/]+)/page/?((1,))/?$"]); $wp_rewrite = array($this -> post_type. wp_rewrite -> index . "?post_type=sheensay_product&paged=" $ wp_rewrite -> preg_index(1), $this -> post_type. "/([^/]+)/page/?((1,))/?$" => $wp_rewrite -> индекс "?sheensay_product_type=. " . $wp_rewrite -> preg_index(1) . "&paged=" . $wp_rewrite -> preg_index(2),) + $wp_rewrite -> правила; ) ) /* * Изпълнение на класа * В скоби можете да дефинирате името на етикета на типа публикация */ new Sheensay_Product("products");</p><p>Сега в админ панела можете да регистрирате нови продукти и техните видове</p> <p>а! Система за управление на съдържанието <b>WordPress</b>получи признание в продължение на няколко години, но истинският пробив беше внедряването на способността за разделяне на записи по типове. В този урок ще разгледаме по-отблизо персонализираните типове публикации, тяхното създаване и използване.</p> <h3>Малко история</h3> <p>На практика персонализираните типове публикации се появиха доста отдавна, по-точно от 17 февруари 2005 г., когато <b>WordPress 1.5</b>добавена е поддръжка за потребителски типове за статични страници, чрез полето post_type в базата данни. Функцията Wp_insert_post() съществува оттогава <b>WordPress 1.0</b>така че когато полето post_type беше имплементирано във 1.5, беше доста лесно да се попълни с помощта на тази функция.</p> <p>И само във версия 2.8 се появи функцията register_post_type() за създаване на потребителски типове и някои други полезни неща бяха налични в „нощните компилации“, а от 2.9 функциите станаха достъпни за всички.</p> <h3>Сега какво?!</h3> <p>Персонализираният тип публикация не е нищо повече от обикновена публикация (статия) със специфична стойност на полето post_type в базата данни. В обикновена публикация полето post_type има стойността <b>пост</b>, страницата има значение <b>страница</b>и така нататък. Сега обаче можем да създадем свои собствени типове, за да уточним спецификата на съдържанието, съдържащо се в публикация. Можете да създавате потребителски типове публикации за книги, филми, вицове, продукти и всичко друго. <br>Ако го направите правилно, можете да постигнете следните резултати само с няколко реда код:</p> <ul><li>Поставете персонализиран тип в главния панел на административната област с елементи от подменюто: списък на всички записи с този тип и създайте нов запис с този тип;</li> <li>Създайте архив от публикации от този тип, тоест направете нещо подобно на главната страница за потребителски тип;</li> <li>Създайте категории и тагове, които могат да бъдат достъпни чрез персонализирани типове публикации, както и персонализирани таксономии.</li> </ul><p>Различните видове съдържание имат различни изисквания за данни. За обикновени публикации ще искате да включите автора, категорията и датата. Докато за запис с тип „книга“ бих искал да мога да посоча автора на книгата, брой страници, жанр, издателство и други специфични данни. Това може лесно да се постигне чрез използване на потребителски (мета полета) области за въвеждане на данни.</p> <p>— области за въвеждане на допълнителни данни директно на страницата за създаване на запис. Тези области улесняват работата с потребителски типове публикации.</p><p><img src='https://i0.wp.com/xozblog.ru/wp-content/uploads/2012/11/meta-boxes.jpg' align="center" height="202" width="299" loading=lazy loading=lazy><br></p> <h3>Работа с персонализирани типове публикации</h3> <p>За да създавате и използвате ефективно персонализирани типове публикации, трябва да сте запознати със следното:</p> <ul><li>Създаване на потребителски типове публикации;</li> <li>Създаване на персонализирана таксономия;</li> <li>Създаване на потребителски области с данни.</li> </ul><h4>Създаване на потребителски типове публикации</h4> <p>Първото нещо, което трябва да направите, е да създадете самия персонализиран тип публикация. В идеалния случай ще създадете плъгин, който да обработва персонализирани типове публикации, но можете също да използвате файла functions.php на вашата тема.</p> <table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><p>1<br>2<br>3<br>4<br>5<br></p> </td><td><p><br>$args = масив (); <br>} <br></p> </td> </tr></tbody></table><p>Това е най-простата форма за създаване на тип, който практически няма настройки. За да разработим нашия нов тип публикации, ще използваме някои от най-често използваните опции и ще ги добавим към празния преди това масив $args.</p> <table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><p>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br>22<br>23<br>24<br>25<br>26<br>27<br></p> </td><td><p>функция my_custom_post_product() ( <br>$етикети = масив ( <br>"име" => _x( "Продукти" , "общо име на тип публикация" ), <br>"singular_name" => _x( "Product" , "post type singular name") , <br>"add_new" => _x( "Добавяне на нов" , "продукт" ) , <br>"add_new_item" => __( <span>„Добавяне на нов продукт“</span> ) , <br>"edit_item" => __( <span>„Редактиране на продукт“</span> ) , <br>"new_item" => __( "Нов продукт") , <br>"all_items" => __( "Всички продукти") , <br>"view_item" => __( <span>„Виж продукта“</span> ) , <br>"search_items" => __( "Намерете продукт") , <br>"not_found" => __( <span>„Няма намерени продукти“</span> ) , <br>"not_found_in_trash" => __( <span>„Няма премахнати продукти“</span> ) , <br>"parent_item_colon" => "" , <br>"menu_name" => "Продукти" <br>) ; <br>$args = масив ( <br>"етикети" => $етикети, <br>"описание" => <span>„Тип персонализиран продуктов запис“</span>, <br>"публично" => вярно, <br>"menu_position" => 5 , <br>"supports" => масив ("title" , "editor" , "thumbnail" , "excerpt" , "comments" , "product_category") , <br>"has_archive" => вярно, <br>) ; <br>register_post_type("продукт", $args); <br>} <br>add_action( "init" , "my_custom_post_product" );</p> </td> </tr></tbody></table> <ul><li><b>етикети</b>— този масив от етикети се използва за описание на персонализирания тип публикация, който се създава в темата./li></li><li><b>описание</b>- обобщение на създадения персонализиран тип публикация, какво прави и защо го използваме.</li> <li><b>публичен</b>— дали потребителският тип да се използва публично и дали да се показва в административната област. В случая истината е установена.</li> <li><b>позиция_меню</b>— позицията на елемента от менюто от нашия тип в главния административен панел. Стойност 5 означава, че елементът ще бъде инсталиран веднага след елемента от менюто „Записи“, ако 10 означава след елемента „Медийни файлове“ и т.н.</li> <li><b>поддържа</b>— тази опция съдържа масив, който описва тези полета, които можем да редактираме на страницата за създаване на запис. Тоест заглавие - ще се появи поле за въвеждане на името на публикацията, редактор - ще се покаже текстово поле за въвеждане на текста на публикацията и т.н. Използваната персонализирана таксономия, product_category, също е посочена.</li> <li><b>има_архив</b>- ако е зададено на true, ще бъде създадено правило за пренаписване, което ви позволява да получите списък със записи от нашия тип на http://mysite.com/product/</li> </ul><p><br><img src='https://i0.wp.com/xozblog.ru/wp-content/uploads/2012/11/custom-post-types-1.png' align="center" width="100%" loading=lazy loading=lazy><br></p> <p>След като инсталирате този код във вашия файл function.php, трябва да видите меню за персонализирания тип публикация. Вече е възможно да добавите запис и да видите списъка със записи.</p> <p>Това обаче не са всички опции за набор от аргументи; ще намерите пълен списък с опции и всички възможности на персонализираните типове.</p> <h4>Интерактивни сигнали</h4> <p>WordPress генерира някои съобщения, задействани от действия на потребителя. Можем също така да създадем подобни съобщения, за да уведомим потребителя, когато работим с типове. Това се прави от post_updated_messages.</p> <table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><p>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br></p> </td><td><p>функция my_updated_messages( $messages ) ( <br>глобален $post, $post_ID; <br>$messages["product"] = array( <br>0 => "" , <br>1 => sprintf ( __( <span>„Продуктът е актуализиран. Вижте“</span><br>2 => __() , <br>3 => __(<span>„Актуализирани персонализирани полета.“</span>) , <br>4 => __(<span>„Продуктът е актуализиран.“</span>) , <br>5 => isset ($_GET [ "ревизия" ] )? sprintf ( __( <span>„Продуктът е възстановен до версия от %s“</span>), wp_post_revision_title( (int) $_GET [ "ревизия"], false )) : false, <br>6 => sprintf ( __( <span>„Публикуван продукт. Вижте“</span>), esc_url( get_permalink($post_ID) ) ), <br>7 => __(<span>„Продуктът е запазен.“</span>) , <br>8 => sprintf ( __( <span>„Продуктът е изпратен. Вижте“</span><br>9 => sprintf ( __( <span>„Продуктът е планиран за: <strong>%1$s</strong>. Виж"</span>), date_i18n( __( "M j, Y @ G:i") , strtotime ($post -> post_date)), esc_url( get_permalink($post_ID)), <br>10 => sprintf ( __( <span>„Черновата на продукта е актуализирана. Преглед“</span>), esc_url( add_query_arg( "preview" , "true" , ​​​​get_permalink($post_ID ) ) ) , <br>) ; <br>връщане на $ съобщения; <br>} <br>add_filter( "post_updated_messages" , "my_updated_messages" ) ;</p> </td> </tr></tbody></table><p>Имайте предвид, че можете да задавате сигнали за всички потребителски типове публикации, като използвате тази функция. Ако не посочите име на тип, предупрежденията ще се използват за всички персонализирани типове.</p><p><img src='https://i2.wp.com/xozblog.ru/wp-content/uploads/2012/11/custom-post-types-2.png' align="center" width="100%" loading=lazy loading=lazy><br></p> <p>Контекстуалните улики рядко се прилагат и използват. Като потребител никога не съм използвал тази функция, но съм сигурен, че някой ги използва. Така че нека създадем такава контекстуална помощ. <br>Контекстните съвети се намират в горния десен ъгъл, близо до раздела за настройки на екрана.</p> <table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><p>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br></p> </td><td><p>функция my_contextual_help( $contextual_help, $screen_id, $screen) ( <br>if ( "edit-product" == $screen -> id ) (</p><p>$contextual_help = <span>"<h2>Продукти</h2><br> <p>Тази страница съдържа списък с всички продукти, които се продават на сайта. Записите са в обратен хронологичен ред, като последните изброени елементи са елементите, които сме добавили първи.</p> <br> <p>Можете да видите/редактирате подробности за всеки продукт, като щракнете върху неговото име, или можете да извършите групови действия, като използвате падащото меню, като изберете няколко елемента.</p>" </span>; </p><p>) elseif ( "product" == $screen -> id ) (</p><p>$contextual_help = <span>"<h2>Създаване/редактиране на продукт</h2><br> <p>Тази страница ви позволява да създадете продукт или да редактирате съществуващи данни за него. Моля, не забравяйте да попълните допълнителните полета.</p>" </span>; </p><p>} <br>върне $contextual_help; <br>} <br>add_action( "contextual_help" , "my_contextual_help" , 10 , 3 ) ;</p> </td> </tr></tbody></table><p>За да покажем такава подсказка, трябва да знаем идентификатора на екрана. Ако по време на създаване трябва да разберете идентификатора на екрана, просто направете следното:</p> <table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"> </td><td><p>echo $screen -> id;</p> </td> </tr></tbody></table><p><br><img src='https://i1.wp.com/xozblog.ru/wp-content/uploads/2012/11/custom-post-types-3.png' align="center" width="100%" loading=lazy loading=lazy><br></p> <h3>Персонализирана таксономия</h3> <p>За обикновен блог категориите и таговете са достатъчни за създаване на организационна структура. Въпреки че за потребителските типове публикации това не винаги е достатъчно. Персонализирана таксономия може да реши този проблем. В нашия случай, таксономия, наречена „Продуктови категории“, която се използва само за публикации с персонализиран тип „Продукти“.</p> <p>Процесът на създаване на персонализирана таксономия е почти идентичен със създаването на потребителски типове публикации. Нека да разгледаме нашия пример:</p> <table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><p>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br>20<br>21<br></p> </td><td><p>функция my_taxonomies_product() ( <br>$етикети = масив ( <br>"име" => _x( <span>"Продуктови категории"</span>, "общо име на таксономията"), <br>"singular_name" => _x( <span>"Категория на продукта"</span>, "таксономично име в единствено число") , <br>"search_items" => __( <span>„Намерете продуктова категория“</span> ) , <br>"all_items" => __( <span>„Всички продуктови категории“</span> ) , <br>"parent_item" => __( <span>„Основна продуктова категория“</span> ) , <br>"parent_item_colon" => __( <span>„Основна продуктова категория:“</span> ) , <br>"edit_item" => __( <span>„Редактиране на продуктова категория“</span> ) , <br>"актуализиран_елемент" => __( <span>„Актуализиране на продуктова категория“</span> ) , <br>"add_new_item" => __( <span>„Добавяне на нова продуктова категория“</span> ) , <br>"new_item_name" => __( <span>„Нова продуктова категория“</span> ) , <br>"menu_name" => __( <span>"Продуктови категории"</span> ) , <br>) ; <br>$args = масив ( <br>"етикети" => $етикети, <br>"йерархичен" => вярно, <br>) ; <br>register_taxonomy( "product_category" , "product" , $args ) ; <br>} <br>add_action( "init" , "my_taxonomies_product" , 0 ) ;</p> </td> </tr></tbody></table><p>Както при създаването на потребителски тип, ние формирахме масив от етикети и посочихме, че йерархичната структура е подходяща за създадената таксономия (т.е. може да има родителски и дъщерни елементи) - това е типично за категориите в обикновените публикации. В противен случай, ако структурата не е йерархична, се създават обикновени тагове. Можете да прочетете повече за таксономията.</p><p><img src='https://i2.wp.com/xozblog.ru/wp-content/uploads/2012/11/custom-post-types-4.png' align="center" width="100%" loading=lazy loading=lazy><br></p> <h3>Допълнителни области с данни</h3> <p>Може да сте виждали допълнителни области или блокове за въвеждане на данни (мета полета) на страницата за редактиране на публикации. Всеки знае стандартните, като избор на категория или тагове. Също така в някои теми има опции, които ви позволяват да прикачите снимка към публикация и т.н.</p> <p>Тъй като създаваме потребителски тип „Продукти“, очевидно ще се нуждаем от цената на продукта, нека да разгледаме процеса на създаване на персонализирани такива.</p> <p>Процесът на създаване може да бъде разделен на 3 етапа:</p> <ul><li>Дефиниране на самия блок;</li> <li>Определяне на съдържанието (кои полета присъстват в блока);</li> <li>Описание на алгоритмите за обработка на въведените данни.</li> </ul><h4>Дефиниция на мета кутии</h4> <table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><p>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br></p> </td><td><p>add_action( "add_meta_boxes" , "product_price_box" ) ; <br>функция product_price_box() ( <br>add_meta_box( <br>"product_price_box" , <br>__("Цена на продукта" , "myplugin_textdomain" ) , <br>"product_price_box_content" , <br>"продукт" <br>"страна" <br>"Високо" <br>) ; <br>} </p> </td> </tr></tbody></table><p>Горният код създава блок със следните параметри:</p> <ul><li><b>product_price_box</b>— уникален идентификатор за мета полето (не е необходимо да съвпада с името на функцията);</li> <li><b>Цена на продукта</b>— името на мета полето, което администраторът вижда на страницата;</li> <li><b>product_price_box_content</b>— функция, която ще показва съдържанието на прозореца;</li> <li><b>продукт</b>— името на персонализирания тип публикация, към който принадлежат мета полетата;</li> <li><b>страна</b>— позиция на блока на страницата (странична, нормална или напреднала — по подразбиране);</li> <li><b>Високо</b>— приоритет на мета полетата (в този случай „висок“, блокът се намира в горната част на страничната лента. Опции: висок, основен, нисък или по подразбиране - по подразбиране).</li> </ul><h4>Определение на съдържанието</h4> <table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><p>1<br>2<br>3<br>4<br>5<br></p> </td><td><p>функция product_price_box_content( $post ) ( <br>wp_nonce_field( plugin_basename( __FILE__ ) , ) ; <br>ехо <span>"<label for="product_price"></label>" </span>; <br>ехо <span>"<input type="text" id="product_price" name="product_price" placeholder="въведете цена">" </span>; <br>} </p> </td> </tr></tbody></table><p>Добавяме само едно поле за въвеждане на цената на продукта. Обърнете внимание, че името на функцията съвпада със стойността на третия параметър, когато е декларирано (код по-горе).</p> <h4>Обработка на въведените данни</h4> <p>Последната стъпка е да запазите въведената цена на продукта в базата данни.</p> <table cellspacing="0" cellpadding="0"><tbody><tr><td class="line-numbers"><p>1<br>2<br>3<br>4<br>5<br>6<br>7<br>8<br>9<br>10<br>11<br>12<br>13<br>14<br>15<br>16<br>17<br>18<br>19<br></p> </td><td><p>add_action( "save_post" , "product_price_box_save" ) ; <br>функция product_price_box_save($post_id) (</p><p>if (defined("DOING_AUTOSAVE") && DOING_AUTOSAVE) <br>връщане ;</p><p>if (! wp_verify_nonce( $_POST [ <span>"product_price_box_content_nonce"</span>], plugin_basename( __FILE__ ) ) ) <br>връщане ;</p><p>if ( "page" == $_POST [ "post_type" ] ) ( <br>if ( ! current_user_can( "edit_page" , $post_id ) ) <br>връщане ; <br>) иначе ( <br>if ( ! current_user_can( "edit_post" , $post_id ) ) <br>връщане ; <br>} <br>$product_price = $_POST [ "product_price" ] ; <br>update_post_meta($post_id, "product_price", $product_price) ; <br>} </p> </td> </tr></tbody></table><p>Повечето от функциите са проверки. Първо, автоматичното запазване е отметнато; цената няма да бъде запазена, докато не бъде натиснат бутона за запазване или актуализиране. След това се проверяват правата за достъп за редактиране на данните на тази публикация и едва след това с помощта на функцията update_post_meta цената се въвежда в базата данни.</p> <h3>Показване на публикации от създадения тип в блога</h3> <p>Преминахме през всички етапи на създаване на персонализиран тип публикация, остава само да се възползваме от плодовете на нашия труд и да създадем показване на публикации в блога в съответствие с таксономията, която сме установили.</p> <p>Тъй като по време на създаването на персонализирания тип посочихме true за параметъра has_archive, списъкът със записи на типа продукт е достъпен на http://mysite.com/product/ .</p> <p>Файлът archive-.php (в нашия случай archive-product.php) се използва за показване, ако съществува. В противен случай archive.php ще се използва за показване и ако такъв файл не е в темата, той ще използва ) <br>) ; <br>$products = new WP_Query($args) ; <br>if ( $products -> have_posts () ) ( <br>докато ( $products -> have_posts () ) ( <br>$продукти -> the_post (); <br>?> <br>< h1> <?php the_title() ?> </ h1> <br>< div class = "content" > <br><?php the_content() ?> <br></ div> <br><?php <br>} <br>} <br>иначе( <br>ехо <span>„О, не, не е намерена храна!“</span>; <br>} <br>?> </p> <h4>Показване на цените</h4> <p>Допълнително въведените данни, в нашия случай цената на продукта, могат да бъдат извлечени чрез функцията get_post_meta(). Тъй като допълнително използваме полето product_price, за да получим стойността на цената:</p> <h3>Плъгин за създаване на потребителски типове публикации</h3> <p>Ако не сте уверени в способностите си за програмиране, винаги можете да намерите готово решение (плъгин) и да го използвате. Персонализираните типове не са изключение. Плъгин <b>WCK Създател на потребителски тип публикации</b>ви позволява лесно да създавате потребителски типове публикации за WordPress без никакви познания по кодиране.</p> <p>Категориите по подразбиране се използват само за публикации. В някои сценарии обаче може да искате да ги използвате с персонализиран тип публикация. В тази статия ще ви кажем как да направите това.</p> <h4>Метод на плъгина</h4> <p>За начинаещи потребители препоръчваме да използвате приставката Custom Post Type UI, за да създадете персонализиран тип публикация. Използвайки този плъгин, вие имате възможността да свържете персонализиран тип публикация с всяка вградена или персонализирана таксономия, включително категории. След като инсталирате плъгина, отидете на потребителския интерфейс на CPT » Добавяне/редактиране на типове публикации, за да създадете нов потребителски тип публикации или да редактирате съществуващ.</p> <p>Превъртете надолу до Advanced Options и там ще видите опцията Built in Taxnomies. Поставете отметка в квадратчето до категориите и запазете типа публикация.</p> <p><img src='https://i0.wp.com/coma.lv/wp-content/uploads/2016/11/enablecategoriesforcpt.jpg' align="center" width="100%" loading=lazy loading=lazy></p> <h4>Ръчно добавяне на категории за персонализиран тип публикация</h4> <p>Ако сте създали персонализиран тип публикация чрез добавяне на код във вашия файл functions.php, тогава ще трябва да промените този код, за да добавите категорията като поддържана таксономия. Всичко, което трябва да направите, е да добавите този ред към вашите персонализирани аргументи за тип публикации:</p> <p><i>‘таксономии’ => масив(‘категория’),</i></p> <p>Възможно е вече да имате този ред във вашия код с друга персонализирана таксономия. Ако е така, тогава просто трябва да добавите запетая след него и да добавите категория:</p> <p><i>‘таксономии’ => масив(‘теми’, ‘категория’),</i></p> <p>Ето пример за целия код, където създадохме персонализиран тип публикация, наречен „филми“ с поддръжка за всички вградени категории.</p><p>Функция custom_post_type() ( // Задаване на UI етикети за персонализиран тип публикация $labels = array("name" => _x("Movies", "Post Type General Name", "twentythirteen"), "singular_name" => _x(" Филм", "Име на тип публикация в единствено число", "twentythirteen"), "menu_name" => __("Movies", "twentythirteen"), "parent_item_colon" => __("Parent Movie", "twentythirteen"), "all_items " => __("Всички филми", "wentythirteen"), "view_item" => __("View Movie", "twentythirteen"), "add_new_item" => __("Добавяне на нов филм", "twentythirteen"), "add_new" => __("Добавяне на нов", "twentythirteen"), "edit_item" => __("Edit Movie", "twentythirteen"), "update_item" => __("Update Movie", "twentythirteen") , "search_items" => __("Търсене на филм", "wentythirteen"), "not_found" => __("Not Found", "twentythirteen"), "not_found_in_trash" => __("Not_found in Trash", " twentythirteen")); // Задайте други опции за персонализиран тип публикация $args = array("label" => __("movies", "twentythirteen"), "description" => __("Movie news and reviews", " twentythirteen"), "labels" => $labels, "supports" => array("title", "editor", "excerpt", "author", "thumbnail", "comments", "revisions", "custom - полета", "йерархичен" => false, "public" => true, "show_ui" => true, "show_in_menu" => true, "show_in_nav_menus" => true, "show_in_admin_bar" => true, "menu_position " => 5, "can_export" => true, "has_archive" => true, "exclude_from_search" => false, "publicly_queryable" => true, "capability_type" => "page", // Това е мястото, където добавяме таксономии към нашите CPT "таксономии" => масив("категория"),); // Регистриране на вашия потребителски тип публикация register_post_type("movies", $args); ). */ add_action("init", "custom_post_type", 0);</p><h4>Показване на множество типове публикации на страница с категория</h4> <p>По подразбиране страниците с категории на сайт на WordPress показват стандартния тип публикация. Ако искате вашият тип публикация да се показва на същата страница с категории като публикациите по подразбиране, тогава трябва да добавите следния код към вашия файл functions.php:</p><p>Add_filter("pre_get_posts", "query_post_type"); функция query_post_type($query) ( if(is_category()) ( $post_type = get_query_var("post_type"); if($post_type) $post_type = $post_type; else $post_type = array("nav_menu_item", "post", " филми"); // не забравяйте nav_menu_item, за да позволите на менютата да работят! $query->set("post_type",$post_type); return $query;</p><p>Не забравяйте да промените филмите на името на персонализирания тип публикация.</p> <p><i>Нашата специалност е разработка и поддръжка на WordPress сайтове. Контакти за безплатна консултация - ,</i></p> <script type="text/javascript"> <!-- var _acic={dataProvider:10};(function(){var e=document.createElement("script");e.type="text/javascript";e.async=true;e.src="https://www.acint.net/aci.js";var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)})() //--> </script><br> <br> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast_after?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy loading=lazy>");</script> </div> <div class="clear"></div> </div> </article> <div class='yarpp-related'> <section id="related_posts"> <div class="block-head"> <span>Повече информация по темата</span> <div class="stripe-line"></div> </div> <div class="post-listing"> <div class="related-item"> <div class="post-thumbnail tie-appear replacemy" data="post_7839"> <img width="195" height="110" src="/uploads/47ec25d591cd094f5abc899417bd868c.jpg" class="attachment-tie-related size-tie-related wp-post-image" alt="Вътрешни части на лаптоп" / loading=lazy loading=lazy></div> <a class="post_7839" href="https://qzoreteam.ru/bg/vnutrennee-ustroistvo-noutbuka-iz-chego-sostoit-noutbuk-chto/">Вътрешни части на лаптоп</a></div> <div class="related-item"> <div class="post-thumbnail tie-appear replacemy" data="post_7839"> <img width="195" height="110" src="/uploads/af04abdcf7234c8c3e89dfa268f35291.jpg" class="attachment-tie-related size-tie-related wp-post-image" alt="Прехвърляне на показания, сметка за газ" / loading=lazy loading=lazy></div> <a class="post_7839" href="https://qzoreteam.ru/bg/pokazaniya-schetchika-gaza-nizhegorodskaya-peredacha-pokazanii/">Прехвърляне на показания, сметка за газ</a></div> <div class="related-item"> <div class="post-thumbnail tie-appear replacemy" data="post_7839"> <img width="195" height="110" src="/uploads/0e0d357be8de6482eddfab74638d57df.jpg" class="attachment-tie-related size-tie-related wp-post-image" alt="Как да конвертирате FLAC файлове в MP3, AAC, WMA, WAV и др." / loading=lazy loading=lazy></div> <a class="post_7839" href="https://qzoreteam.ru/bg/iz-wav-v-flac-onlain-kak-konvertirovat-faily-flac-v-mp3-aac-wma-wav-i-t-d/">Как да конвертирате FLAC файлове в MP3, AAC, WMA, WAV и др.</a></div> <div class="related-item"> <div class="post-thumbnail tie-appear replacemy" data="post_7839"> <img width="195" height="110" src="/uploads/0ad2a4ee8e58154eb6ed58fbb05e699c.jpg" class="attachment-tie-related size-tie-related wp-post-image" alt="Изтеглете приложението Yota Ready за Windows на вашия компютър или лаптоп" / loading=lazy loading=lazy></div> <a class="post_7839" href="https://qzoreteam.ru/bg/iota-prilozhenie-dlya-pk-ckachat-prilozhenie-yota-ready-dlya-windows-na-kompyuter/">Изтеглете приложението Yota Ready за Windows на вашия компютър или лаптоп</a></div> <div class="related-item"> <div class="post-thumbnail tie-appear replacemy" data="post_7839"> <img width="195" height="110" src="/uploads/5bd09a3d5e798134f8879b4ed427a2b0.jpg" class="attachment-tie-related size-tie-related wp-post-image" alt="Лесни начини за инсталиране на ipa файлове на джаджи на Apple Отворете ipa файл на ipad" / loading=lazy loading=lazy></div> <a class="post_7839" href="https://qzoreteam.ru/bg/kak-ustanovit-neoficialnye-prilozheniya-na-ios-bez-dzheilbreika-prostye/">Лесни начини за инсталиране на ipa файлове на джаджи на Apple Отворете ipa файл на ipad</a></div> <div class="related-item"> <div class="post-thumbnail tie-appear replacemy" data="post_7839"> <img width="195" height="110" src="/uploads/d79ff37aeb17ff4d73244884cfe7a1c1.jpg" class="attachment-tie-related size-tie-related wp-post-image" alt="Да се ​​научите да публикувате в YouTube и"Инстаграм"" / loading=lazy loading=lazy></div> <a class="post_7839" href="https://qzoreteam.ru/bg/kak-vylozhit-video-v-internet-uchimsya-vykladyvat-v-youtube-i/">Научете се да публикувате в YouTube и Instagram</a></div> </div> </section> </div> <div id="comments"> <ol class="commentlist"> <div class='rreekk' rel='15'> <div id="smartrotator_ad_4" onclick="yaCounter40492595.reachGoal ('tizercommentbefore1'); return true;"></div> </div> </ol> <div class="clear"></div> <div id="respond" class="comment-respond"> </div> </div> </div> <aside id="sidebar"> <div class="theiaStickySidebar"> <div class="execphpwidget"> <div id="text-4" class="widget widget_text"> <div class="widget-top"> <span>Полезен</span> <div class="stripe-line"></div> </div> <div class="widget-container"> <div class="textwidget"> <style> .wpp-list li img { -webkit-border-radius: 65px; -moz-border-radius: 65px; border-radius: 65px; } .wpp-list li .post-views { display: block; margin-left: 70px; color: #828283; font-size: 12px; } .wpp-list li .post-views i { font-size: 13px; } .wpp-list li { line-height: 22px !important; } .replacemy { cursor: pointer; } } </style> <ul class="wpp-list"> <li> <div class="replacemy"><img src="/uploads/6de910abbef3c8b9f40ae4b49b080f72.jpg" width="65" height="65" title="Как да намерите изгубен телефон с Android: всички методи и препоръки" alt="Как да намерите изгубен телефон с Android: всички методи и препоръки" class="wpp-thumbnail wpp_cached_thumb wpp_featured" / loading=lazy loading=lazy></div><a href="https://qzoreteam.ru/bg/prilozhenie-dlya-otslezhivaniya-mestonahozhdeniya-telefona-kak/" class=""><br>Как да намерите изгубен телефон с Android: всички методи и препоръки</a></li> <li> <div class="replacemy"><img src="/uploads/e01a8d75522fc41460b904b2ede30a34.jpg" width="65" height="65" title="Настройте интернет на android vertex оператор mts" alt="Настройте интернет на android vertex оператор mts" class="wpp-thumbnail wpp_cached_thumb wpp_featured" / loading=lazy loading=lazy></div><a href="https://qzoreteam.ru/bg/mobilnyi-telefon-vertex-instrukciya-po-ekspluatacii-nastroit-internet-na/" class=""><br>Настройте интернет на android vertex оператор mts</a></li> <li> <div class="replacemy"><img src="/uploads/6a39a62b938cc8f6a726d7a723ebfe20.jpg" width="65" height="65" title="LG G Flex - Спецификации Lg вдлъбнат" alt="LG G Flex - Спецификации Lg вдлъбнат" class="wpp-thumbnail wpp_cached_thumb wpp_featured" / loading=lazy loading=lazy></div><a href="https://qzoreteam.ru/bg/obzor-lg-g-flex-vot-tak-zagnuli-lg-g-flex---tehnicheskie-harakteristiki-lg-vognutyi/" class=""><br>LG G Flex - Спецификации Lg вдлъбнат</a></li> <li> <div class="replacemy"><img src="/uploads/2bb7a7d49f5d45a79cc42a6e2e1fbec5.jpg" width="65" height="65" title="Пощенски картички и поздравления по имейл Как да изпратите пощенска картичка по имейл" alt="Пощенски картички и поздравления по имейл Как да изпратите пощенска картичка по имейл" class="wpp-thumbnail wpp_cached_thumb wpp_featured" / loading=lazy loading=lazy></div><a href="https://qzoreteam.ru/bg/kak-otpravit-otkrytku-po-elektronnoi-pochte-otkrytki-i/" class=""><br>Пощенски картички и поздравления по имейл Как да изпратите пощенска картичка по имейл</a></li> <li> <div class="replacemy"><img src="/uploads/13499baceef818e8f97fdfc337b01da6.jpg" width="65" height="65" title="Кой Windows е по-добър за игри?" alt="Кой Windows е по-добър за игри?" class="wpp-thumbnail wpp_cached_thumb wpp_featured" / loading=lazy loading=lazy></div><a href="https://qzoreteam.ru/bg/kakuyu-vindovs-7-luchshe-ustanovit-dlya-igr-kakaya-vinda-luchshe-dlya-igr/" class=""><br>Кой Windows е по-добър за игри?</a></li> </ul> </div> </div> </div> </div> </div> <div> </div> </aside> <div class="clear"></div> </div> <footer id="theme-footer"> <div id="footer-widget-area" class="wide-narrow-2c"><div id="footer-first" class="footer-widgets-box"><div id="text-2" class="footer-widget widget_text"><div class="footer-widget-top"></div><div class="footer-widget-container"><div class="textwidget"> <p>Всичко за съвременните технологии. Грешки. игри. Разбивки. Техника. интернет <p></p> </div></div></div></div><div id="footer-second" class="footer-widgets-box"><div id="text-3" class="footer-widget widget_text"> <div class="footer-widget-top"></div> <div class="footer-widget-container"> <div class="textwidget"><a href="https://qzoreteam.ru/bg/sitemap.xml">Карта на сайта</a></div> </div> </div><div id="text-7" class="footer-widget widget_text"><div class="footer-widget-top"></div><div class="footer-widget-container"><div class="textwidget"><br> <a href="https://qzoreteam.ru/bg/feedback/">Обратна връзка</a> </div></div></div></div></div><div class="clear"></div> </footer> <div class="clear"></div> <div class="footer-bottom"> <div class="container"> <div class="alignright"></div> <div class="alignleft">© Copyright 2017, https://qzoreteam.ru</div> <div class="clear"></div> </div> </div> </div> </div> </div> <div id="topcontrol" class="fa fa-angle-up" title="Отидете в началото на страницата"></div> <div id="fb-root"></div> <script type="text/javascript"> jQuery(function($) { $(document).on("click", ".pseudo-link", function() { window.open($(this).data("uri")); }); }); </script> <script type='text/javascript'> /* */ var tocplus = { "smooth_scroll": "1", "visibility_show": "\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c", "visibility_hide": "\u0441\u043a\u0440\u044b\u0442\u044c", "width": "310px" }; /* */ </script> <script type='text/javascript' src='https://qzoreteam.ru/wp-content/plugins/table-of-contents-plus/front.min.js'></script> <script type='text/javascript' src='https://qzoreteam.ru/wp-content/plugins/wp-polls/polls-js.js'></script> <script type='text/javascript' src='https://qzoreteam.ru/wp-content/plugins/wp-postratings/js/postratings-js.js'></script> <script type='text/javascript'> /* */ var tie = { "mobile_menu_active": "true", "mobile_menu_top": "", "lightbox_all": "", "lightbox_gallery": "", "woocommerce_lightbox": "", "lightbox_skin": "dark", "lightbox_thumb": "vertical", "lightbox_arrows": "true", "sticky_sidebar": "", "is_singular": "1", "SmothScroll": "true", "reading_indicator": "", "lang_no_results": "\u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0448\u043b\u043e\u0441\u044c", "lang_results_found": "\u041d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b" }; /* */ </script> <script type='text/javascript' src='https://qzoreteam.ru/wp-content/themes/pochk/js/tie-scripts.js'></script> <script type='text/javascript' src='https://qzoreteam.ru/wp-content/themes/pochk/js/ilightbox.packed.js'></script> <script type='text/javascript' src='/wp-includes/js/comment-reply.min.js'></script> <script type='text/javascript' src='/wp-includes/js/wp-embed.min.js'></script> <script type='text/javascript'> /* */ var gglcptch_pre = { "messages": { "in_progress": "\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0434\u043e\u0436\u0434\u0438\u0442\u0435\u0441\u044c \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 Google reCAPTCHA.", "timeout": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c Google reCAPTCHA. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0412\u0430\u0448\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0442\u0438 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u044d\u0442\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443." } }; /* */ </script> <script type='text/javascript' src='https://qzoreteam.ru/wp-content/plugins/google-captcha/js/pre-api-script.js'></script> <script type='text/javascript' data-cfasync="false" async="async" defer="defer" src='https://www.google.com/recaptcha/api.js?onload=gglcptch_onload_callback&render=explicit'></script> <script type='text/javascript' src='https://qzoreteam.ru/wp-content/plugins/google-captcha/js/script.js'></script> <script type="text/javascript" src="https://qzoreteam.ru/wp-content/themes/pochk/my/my.js"></script> <script type="text/javascript" src="https://qzoreteam.ru/wp-content/themes/pochk/my/etimer.js"></script> <script type="text/javascript"> <!-- var _acic={dataProvider:10};(function(){var e=document.createElement("script");e.type="text/javascript";e.async=true;e.src="https://www.acint.net/aci.js";var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)})() //--> </script><br> <br> </body> </html>