我知道我已经发布了这个问题的答案,但我已经找到了一个更好的解决方案,所以我想花点时间分享一下。
事实证明,在我之前的回答中,JS解决方案存在一个小问题,直到我有一个朋友测试我的正在进行的应用程序时,这个问题才浮出水面。
问题之前,我将作业步骤定义为Repeater Field 有两个子字段:标题和详细信息。“详细信息”子字段是所见即所得字段,使用户可以对格式进行某种控制。
问题是,tinyMCE使用的JavaScript将textarea
用户友好的WYSIWYG中的输入textarea
加载页面后。这导致了问题,因为我的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()
呼叫当我用从原型加载的内容替换空白的工作内容时,我的用户得到的是一个纯文本框,而不是所见即所得编辑器。
所以,与其看到Quantity, 他们看到:
<p><strong>Quantity</strong></p>
不用说,这不是我想要的。
我跟着jgraup\'并研究了一些ACF插件,但事实证明,我可以用插件已经提供的过滤器来解决这个问题。
我们要用于此的筛选器是:acf/load_value/key=[field_key]
. 基本上,这是一个动态过滤器,允许您钩住特定自定义字段的加载过程。
步骤1
Redefine my custom fields (slightly).
最初,作业和作业原型使用相同的字段组:
wf_jobStepFields
, 但要使此过程正常工作,我需要维护字段的两个副本:
wf\\U jobStepFields在每个字段组中都是唯一的转发器字段:wf_job_steps
和wf_archetype_steps
. 子字段键保持不变(step_title
和step_details
)
第2步
Hook into the ACF filter
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
Repeater Field步骤3
Override values on the New Job Form
我在前端有一个页面,用户可以访问该页面提交新工作。默认情况下,此页面包含定义了单个作业步骤的空白作业,但使用此挂钩,我们可以使用选定的原型模板覆盖该作业:
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
Override values on the Admin screen
虽然我有一个用于添加新作业的前端表单,但我希望确保后端屏幕提供相同的功能,以便也可以从管理区域利用原型。
// 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);
}
}
}
最终结果
Put it all together, and the final function looks like this:
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);
<小时>
NOTE: 通常,我不太喜欢定义第二个字段组。在本例中,这几乎是复制/粘贴代码的教科书定义,因为字段组除了几个键之外,在功能上是相同的。
但是,在这种情况下这样做有很好的理由。
我们钩住的过滤器锁定特定字段的加载事件(由字段的键定义)。在这种情况下,我们将锁定wf\\u job\\u步骤。
如果我继续使用单个字段组,那么这个过滤器挂钩会将进程抛出到infinite loop, 因为每次我的过滤函数get_field()
调用时,将再次触发筛选器。
为中继器字段定义具有唯一键的第二个字段组可以防止无限循环,但由于子字段仍然具有相同的键值,因此允许它们无缝地转移到新作业。