Intereting Posts
сохранить содержимое в wordpress wp_post таблицу базы данных Как сохранить ссылку на ссылку url ссылки? Проблема с загрузкой различных файлов в качестве настраиваемых полей с форматом сообщения переднего конца как добавить пользовательский wp_nav_menu класс css selector в ul и теги? Загружается с сайта на сервере A, загруженном на сервер B (вроде рода CDN) У панели инструментов 3.4.2 есть заголовки Chrome Frame? Динамическое обновление содержимого страницы Лучшие практики для полностью настраиваемой домашней страницы – без плагинов Создание файлов cookie в php-файле, но не чтение / доступ в файле wordpress header.php Добавить функцию jQuery на страницы администратора Что конкретно должно быть включено в тему_имя_setup ()? Текст социальных ссылок отображается на выдержках Крючок wp_enqueue_scripts не вызывается Есть ли плагин или простой способ добавить метабокс с несколькими изображениями в сообщение? Локальная установка WordPress не обрезает изображения

Добавление содержимого шаблона

Я попытался найти это, используя различные термины, но я всегда получаю ответы на вопросы, относящиеся к файлам шаблонов php. Это не то, что я ищу, поэтому я задаю новый вопрос. Прошу прощения, если это дубликат.

В принципе, я ищу способ создания сообщений шаблонов. Я использую ACF Pro для пользовательского типа задания «Работа», и у меня есть поле повторителя, настроенное для «Шагов работы».

Например, для задания «Сделать пиццу» будут выполняться следующие действия:

  1. Приказал
  2. приготовительный
  3. Выпекать
  4. коробка
  5. доставить

То, как в настоящее время настроены настройки, пользователям придется вручную определять эти шаги каждый раз, поэтому мне бы хотелось создать шаблон «Pizza Template», который пользователи могут использовать для определения шагов один раз, а затем добавить новая работа «Сделать пиццу» будет автоматически определять шаги, но позволяет пользователям заполнять конкретные детали, такие как начинки, корка, адрес доставки и т. д.

Одна из вещей, о которых я думал, – это добавить новый тип публикации «Шаблон задания», который использует те же пользовательские определения полей, что и тип «Job». Затем, когда пользователи создадут новое задание, им будет предложено выбрать «Шаблон задания».

Если они выбрали «Pizza Template», он скопировал значения поля Repeater в столбце Job Template и установил их в редакторе для нового задания. Я подозреваю, что это будет очень запутанный процесс, поэтому я надеюсь, что кто-то знает более эффективный путь где-то в ядре.

редактировать

Основываясь на комментариях, я вижу, что один аспект этого вопроса был не таким ясным, как я думал, поэтому даем больше информации:

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

Этот подход также позволяет пользователям определять несколько рабочих процессов без необходимости в нескольких группах полей или нескольких типах сообщений.

Я сам работаю над несколькими возможными решениями (и буду публиковать ответы, когда я туда доберусь), но я действительно надеюсь, что в этом я могу что-то сделать, чтобы сделать это проще.

Solutions Collecting From Web of "Добавление содержимого шаблона"

Возможно, вам, возможно, придется определить свой собственный пользовательский тип поля ACF, который содержит ваши шаблоны. И после выбора шаблона вы программно копируете поля в ретранслятор . У Awesome ACF есть немало примеров, у WordPress есть довольно много плагинов, и есть форум поддержки дополненных пользователем дополнений .

Я смог снять это со второго типа сообщения и немного JavaScript.

Шаг 1. Назначение группы полей ACF

У меня уже была определена поле группы шагов задания , поэтому я немного изменил настройку и назначил ее как для заданий, так и для заданий:

// [...] This is a snip from the full custom field setup 'location' => array ( array ( array ( 'param' => 'post_type', 'operator' => '==', 'value' => 'my-job', ), ), array ( array ( 'param' => 'post_type', 'operator' => '==', 'value' => 'my-job-archetype', ), ), ), 

Теперь я могу получить доступ к шагам работы таким же образом, как и для типов контента.


Шаг 2. Зарегистрируйте пользовательский запрос.

Следующее, что я сделал, это добавить пользовательскую переменную запроса для идентификатора сообщения Archetype:

 function my_registerArchetypeQueryVar($vars) { $vars[] = 'archetypeId; return $vars; } add_filter('query_vars', 'my_registerArchetypeQueryVar'); 

Шаг 3: Форма переднего конца – Редактировать архетип

Затем я создал страницу Edit Archetype со следующим:

 if(get_query_var('archetypeId')) { $id = get_query_var('archetypeId'); $jobArchetype = get_post($id); if ($jobArchetype) { acf_form(array( "id" => "editJobForm", "post_id" => $id, "post_title" => true, 'field_groups' => array('my_jobStepFields'), "return" => "%post_url%", "submit_value" => __("Update Archetype", 'acf'), )); } else { acf_form(array( "id" => "addJobForm", "post_id" => 'new_post', 'new_post' => array( 'post_type' => 'my-job-archetype', 'post_status' => 'publish' ), "post_title" => true, 'field_groups' => array('my_jobStepFields'), "return" => "%post_url%", "submit_value" => __("Add Archetype", 'acf'), )); } } 

На этой странице я захватываю archetypeId query var и использую это, чтобы вытащить форму ACF для указанной записи. (И если archetypeId не предоставлен, я вместо этого создаю форму New Archetype.


Шаг 4: Форма переднего конца – новое задание

Затем я создал новую страницу работы со следующим:

 $id = get_query_var('archetypeId'); $jobArchetype = get_post($id); if ($jobArchetype) { ?> <script> $(document).ready(function() { my_loadJobArchetype(); }); function my_loadJobArchetype() { $('<div>').load("<?php echo get_page_by_path('edit-archetype') . "?archetypeId=" . $jobArchetype->ID; ?>" + ' ' + "[data-name='wf_job_steps']", function() { $("[data-name='wf_job_steps']").replaceWith( $(this).children("[data-name='wf_job_steps']") ); }); } </script> <?php } 

Когда на странице «Новое задание» появляется идентификатор архетипа, он загружает собственный скрипт, который по существу заменяет пустой раздел «Шаги работы» формы «Новый задание» копией раздела «Шаги задания» в форме «Редактировать тип архетипа».


Сценарий

Когда страница отображается в браузере клиента, она будет выглядеть примерно так:

 <script> $(document).ready(function() { my_loadJobArchetype(); }); function my_loadJobArchetype() { $('<div>').load("mysite.com/edit-archetype/?archetypeId=123" + ' ' + "[data-name='my_job_steps']", function() { $("[data-name='my_job_steps']").replaceWith( $(this).children("[data-name='my_job_steps']") ); }); } </script> 

И вот разбивка того, что происходит:

$(ducument).ready() вызывает my_loadJobArchetype() как только загружается страница.

Затем мы загружаем часть страницы Edit Archetype в новый элемент <div> с:

 $('<div>').load("mysite.com/edit-archetype/?archetypeId=123" + ' ' + "[data-name='my_job_steps']" // ... ); 

На самом деле мы передаем что-то похожее на два аргумента. Аргумент url функции load() jQuery также может содержать строку селектора jQuery (разделенную пробелом), которая будет загружать только фрагмент целевой страницы, а не весь документ.

Я проверил источник моих страниц «Редактировать архетип» и «Новые задания» и обнаружил, что группа полей «Шаг задания» содержится в <div> с атрибутом: data-name="my-job-steps" (значение этого атрибута как правило, является ключом, определенным для настраиваемой группы полей).

Зная это, я построил селектор jQuery на основе этого атрибута: [data-name='my_job_steps'] который я передал с аргументом url вызова load() .

Затем, в функции обратного вызова, я захватываю существующий раздел «Шаги работы» на странице и заменяю его секцией, загруженной с страницы «Редактировать шаблон».

 function() { $("[data-name='my_job_steps']").replaceWith( $(this).children("[data-name='my_job_steps']") ); } 

Элементом $(this) в этом случае является новый элемент <div> мы создали для хранения ответа от load() .

Конечным результатом является функциональная функция шаблонирования. Я не совсем доволен тем, что теперь я полагаюсь на JavaScript, чтобы это работало, но это начало.

Когда я выясню, как добиться этого без JS, я обязательно поделюсь.

Я знаю, что уже написал ответ на этот вопрос, но я нашел лучшее решение, поэтому я хотел потратить время, чтобы поделиться этим.

Как оказалось, в моем предыдущем ответе есть одна маленькая икота с решением JS, которое не было до тех пор, пока у меня не было друга, который тестировал мое приложение.

Проблема

Раньше я определял шаги работы как поле повторителя с двумя подполями: заголовок и детали. Подполе Детали является полем WYSIWYG, чтобы дать пользователям некоторый контроль над форматированием.

Проблема в том, что tinyMCE использует JavaScript, который обертывает вложенные текстовые поля в удобном textarea WYSIWYG после загрузки страницы. Это вызвало проблемы, поскольку мое решение JS:

 function my_loadJobArchetype() { $('<div>').load("mysite.com/edit-archetype/?archetypeId=123" + ' ' + "[data-name='my_job_steps']", function() { $("[data-name='my_job_steps']").replaceWith( $(this).children("[data-name='my_job_steps']") ); }); } 

Не выполнялись сценарии во время вызова load() . Когда я заменил пустой контент Job содержимым, загруженным из архетипа, мои пользователи получали текстовое поле, а не редактор WYSIWYG.

Итак, вместо того, чтобы видеть такие вещи, как Количество , они увидели:

 <p><strong>Quantity</strong></p> 

Излишне говорить, что это не то, что я хотел.

Я следовал за предложением jgraup и изучал некоторые плагины ACF, но, оказывается, я могу решить его с помощью фильтров, уже предоставленных плагином.

Фильтр, который мы хотим использовать для этого: acf/load_value/key=[field_key] . В принципе, это динамический фильтр, который позволяет вам подключаться к процессу LOADING для определенных настраиваемых полей.


Шаг 1

Переопределите мои пользовательские поля (слегка).

Первоначально wf_jobStepFields задания и задания использовали одну и ту же группу полей: wf_jobStepFields , но для правильного функционирования этого процесса мне нужно сохранить две копии полей:

  • wf_jobStepFields
  • wf_archetypeStepFields

Внутри каждой из этих групп полей есть уникальное поле ретранслятора: wf_job_steps и wf_archetype_steps . Клавиши step_title остаются неизменными ( step_title и step_details )

Шаг 2

Подключить фильтр ACF

 function my_loadArchetypeValue($value, $post_id, $field) { } add_filter('acf/load_value/key=wf_job_steps', 'my_loadArchetypeValue', 10, 3); 

"acf/load_value/key={$field_key}" – это гибкий крючок фильтра, который позволяет нам защелкнуть процесс загрузки для отдельного поля. В этом случае мы wf_job_steps поле повторителя wf_job_steps

Шаг 3

Переопределить значения в новой форме работы

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

  function my_loadArchetypeValue($value, $post_id, $field) { // FIRST: Check to make sure we are on the NEW JOB page. if (is_page('new-job')) { // Check to see if the "archetypeId" query variable is defined. if (get_query_var("archetypeId")) { // If it is, grab the VALUE of the ARCHETYPE STEPS for the selected Archetype return get_field('wf_archetype_steps',get_query_var("archetypeId")); } } } 

Шаг 4

Переопределить значения на экране администратора

Хотя у меня есть форма интерфейса для добавления новых заданий, я хочу убедиться, что бэкэнд-экран обеспечивает ту же функциональность, что и Archetypes можно использовать из области администрирования.

 // First, check to make sure that the get_current_screen() function is defined. // It is not defined on every admin page, but it is defined on the // ADD NEW pages, which is where we want to be. if (function_exists("get_current_screen")) { // Grab the current screen OBJECT and save it $screen = get_current_screen(); // This statement checks to make sure that we are on the // ADD NEW screen for the JOB post type if ($screen->action == 'add' && $screen->post_type == wf-job) { $archetypeId = $_GET["archetypeId"]; /* NOTE: the global WP_Query object has no query vars here, / so we need to get a little "creative to pull the / variable from the URL. Technically, $_GET["archetypeId"] will also work on the Add Job form as well, but we have access to the WP_Query query vars there, and I think that using the WP core whenever possible makes WordPress related functions easier to follow */ if ($archetypeId) { return get_field('wf_archetype_steps', $archetypeId); } } } 

Итоговый результат

Поместите все это вместе, и конечная функция будет выглядеть так:

 function my_loadArchetypeValue($value, $post_id, $field) { if (is_page('new-job')) { $archetypeId = get_query_var("archetypeId"); if ($archetypeId) { return get_field('wf_archetype_steps',$archetypeId); } } elseif (function_exists("get_current_screen")) { $screen = get_current_screen(); if ($screen->action == 'add' && $screen->post_type == wf-job) { $archetypeId = $_GET["archetypeId"]; if ($archetypeId) { return get_field('wf_archetype_steps', $archetypeId); } } } return $value; } add_filter('acf/load_value/key=wf_job_steps', 'my_loadArchetypeValue', 10, 3); 

ПРИМЕЧАНИЕ. Как правило, я не большой поклонник определения второй группы полей. В этом случае это в значительной степени определение кода для копирования / вставки кода, поскольку группы полей функционально идентичны, кроме пары ключей.

Но в этом случае есть очень веская причина.

Фильтр, который мы подключаем в защелки к событию LOAD для определенного поля (определяется ключом поля). В этом случае мы запираемся на wf_job_steps.

Если бы я продолжал использовать одну группу полей, этот крючок фильтра перебрасывал бы процесс в бесконечный цикл , потому что каждый раз, когда моя функция фильтра попадала в get_field() , фильтр запускался бы снова.

Определение второй группы полей с уникальным ключом для поля ретранслятора предотвращает бесконечный цикл, но поскольку подполя все еще имеют одни и те же значения KEY, он позволяет им беспрепятственно передавать новые JOBS.