В шаблонах записей можно использовать произвольные поля. Для этого достаточно обернуть название произвольного поля символами %% (пример – %%_aioseop_title%%). Однако, при использовании произвольных полей, созданных плагином Advanced Custom Fields зачастую получить значение этих произвольных полей затруднительно, так как ACF хранит многие поля в своем собственном формате. Как это обойти? В плагине есть фильтр шаблонов yturbo_the_template, которым можно воспользоваться.
Покажу на примере, предположим у вас в ACF созданы произвольное поля:
myimage – тип “Изображение”, возвращаемое значение “Массив изображения”.
steps – тип “Повторитель”, внутри есть произвольные поля:
image – тип “Изображение”, возвращаемое значение “Ссылка на изображение”;
text – тип “Текст”.
Если вы пропишите в шаблоне:
%%myimage%% %%steps%% %%post_content%%
То в результате получите что-то типа:
<p>92332</p> <p>контент записи</p>
То есть вместо картинки вы получили ID этого массива картинок, а поле типа “Повторитель” вообще было проигнорировано.
Вот для обработки таких нестандартных произвольных полей и нужен фильтр yturbo_the_template. Вот пример кода, обрабатывающего эти поля:
//обработка произвольных полей плагина ACF begin function yturbo_acf_template( $content ) { //обрабатываем только нужные нам поля (остальные обработает плагин RSS for Yandex Turbo) if (preg_match_all("/%%(.*?)%%/i", $content, $res)) { foreach ($res[0] as $r) { //обрабатываем поле %%myimage%% (заменяем его на результат работы функции ct_get_myimage) if($r == '%%myimage%%') { $content = str_replace($r, ct_get_myimage(), $content); } //обрабатываем поле %%steps%% (заменяем его на результат работы функции ct_get_steps() ) if($r == '%%steps%%') { $content = str_replace($r, ct_get_steps(), $content); } } } return $content; } add_filter( 'yturbo_the_template', 'yturbo_acf_template' ); //обработка произвольных полей плагина ACF end //обработка произвольного поля %%myimage%% begin function ct_get_myimage() { if ($field = get_field('myimage')) { $output = '<figure><img src="' . $field['sizes']['photo'] . '" /></figure>'; } return $output; } //обработка произвольного поля %%myimage%% end //обработка произвольного поля %%steps%% begin function ct_get_steps() { if ($items = get_field('steps')) { $count = 0; $i = 1; foreach ($items as $item) {$count++;} foreach ($items as $item) { $output .= '<h3>Шаг ' . $i . ' из ' . $count . ' </h3>'; $i++; $output .= '<figure><img src="' . $item['image'] . '" /></figure>'; $output .= $item['text']; } } return $output; } //обработка произвольного поля %%steps%% end
Принцип довольно простой и я думаю, что вам должно быть тут все понятно. Результатом этого кода будет что-то типа:
<figure><img src="http://site.com/wp-content/uploads/2018/06/cover-47.jpg" /></figure> <h3>Шаг 1 из 2 </h3> <figure><img src="http://site.com/wp-content/uploads/2018/06/cover-45.jpg" /></figure> <p>первое изображение</p> <h3>Шаг 2 из 2 </h3> <figure><img src="http://site.com/wp-content/uploads/2018/06/cover-38.jpg" /></figure> <p>второе изображение</p> <p>контент записи</p>
Учтите, что результат вывода вашего шаблона будет потом обработан фильтрами плагина. Это может вызвать определенные проблемы, так как фильтры плагина удалят всю лишнюю разметку, которая вам может быть нужна. Например, если вы пытаетесь создать турбо-галерею, а плагин каждую вашу картинку оборачивает в тег <figure>, что портит разметку турбо-галереи. В таком случае вам нужно воспользоваться фильтром yturbo_before_ads, который срабатывает почти в самом конце обработки контента записи прямо перед вставкой рекламы. Однако, ваши переменные не должны быть обернуты символами %% (их содержимое будет удалено при обработке шаблона). Воспользуйтесь любыми другими символами, чтобы отфильтровать потом вашу переменную.