Arhn - архитектура программирования

Как настроить пользовательские типы записей и поля ACF в Timber

Я новичок в Timber / Twig / PHP, и у меня есть довольно специфические требования. У меня есть page-home.php / page-home.twig, который отображает пару полей ACF, отзывы как настраиваемый тип сообщения и последние 3 сообщения в блоге.

В основном меня устраивает внешний интерфейс Twig, но возникают трудности с настройкой файлов шаблонов php.

Я прочитал документацию по Timber и у меня сложилось впечатление, что ACF встроен, так что поле можно просто вызвать непосредственно в Twig. Также проверил Github и SO на похожие проблемы, но не нашел ответа. На YouTube есть видео, посвященное пользовательским типам сообщений, но оно находится в цикле только сообщений.

Это моя страница-home.php

echo 'page-home.php';

$context = Timber::get_context();
$context['page'] = new Timber\Post();

$templates = array('page.twig');
if (is_front_page()){

    $context['posts'] = Timber::get_posts('post_type=post&posts_per_page=3');
    $context['testimonials'] = Timber::get_posts('post_type=testimonials');

    // add your twig view to the front of the templates array
    array_unshift($templates, 'page-home.twig');
}

Timber::render( $templates, $context );


$image = get_field('hero_image');

echo '<pre>';
    var_dump( $image );
echo '</pre>';

page-home.php, как и ожидалось, показывает 3 сообщения в блоге, но возвращает значение NULL для поля ACF var_dump.

Если я прокомментирую эту строку // $context['posts'] = new Timber\PostQuery($args);, я получу var_dump моего массива изображений, хотя он не отображается в файле Twig.

Это изображение в page-home.twig <div class="image image-overlay" style="background-image:url({{ Image(post.meta('hero_image')).src }})"></div>, которое возвращает пустое значение.

Сообщения в блогах называются:

{% for post in posts %}
  {% include "blogpost-card.twig" %}
{% endfor %}

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

Я использую стартовую тему, установленную через Composer. Было бы здорово, если бы тема или документация содержали пример страницы, содержащей сообщения, пользовательские сообщения и поля ACF, поскольку я думаю, что это очень распространенный сценарий. По крайней мере, для таких, как я, которым нужна небольшая дополнительная помощь со стороной PHP.


  • По крайней мере, в одной части этой проблемы я ошибся в выборе шаблона. Поскольку настраиваемое поле (изображение) установлено на главной странице страницы, эту страницу необходимо сделать статической домашней страницей в настройщике. Я использую page-home.php и page-home.twig. В этом случае мне нужно array_unshift($templates, 'page-home.twig'); Однако изображение все еще не отображается, хотя var_dump возвращает данные, и я все еще не могу отобразить как сообщения, так и отзывы. 07.09.2019
  • Наконец-то я смог получить оба типа сообщений: $data['posts'] = Timber::get_posts('post_type=post&posts_per_page=3'); $data['testimonials'] = Timber::get_posts('post_type=testimonials'); и 'for post in posts (or) testimonials' 07.09.2019
  • По какой-то причине поле ACF не передается в шаблон Twig. Var_dump поступал прямо из PHP. Если я сделаю {{ dump(user) }} в файле Twig, я получу данные. Но если я сделаю {{dump (post.hero_image)}} (или ..hero_image, или изображение), я получу NULL. Я продолжу расследование и опубликую решение, когда найду его. Я уверен, что в ретроспективе это будет что-то действительно очевидное ... 08.09.2019
  • Можете ли вы изменить $post = new Timberpost() на $post = new Timber\Post()? Какое значение возвращается для вашего hero_image в полевых настройках ACF? Можете ли вы убедиться, что он возвращает идентификатор? Что вы получите, если запустите {{ dump(post.meta('hero_image))}} `только в Twig? 08.09.2019
  • Я отредактировал приведенный выше код с front-page.php на page-home.php с изменениями, внесенными для успешного вывода как сообщений в блогах, так и отзывов. Var_dump из шаблона php также теперь запускается, но я все еще не получаю файл Twig для вывода чего-либо, кроме NULL для настраиваемого поля image_hero 09.09.2019
  • Я дважды проверил, что файл шаблона php var_dump появляется только тогда, когда статическая домашняя страница установлена ​​на Home в настройщике, где установлено изображение ACF. 09.09.2019
  • Добавление \, изменение вывода изображения на ID вместо массива и {{dump (post.meta ('hero_image'))}} по-прежнему возвращает NULL из файла Twig 09.09.2019
  • А что будет, если использовать {{ dump(page.meta('hero_image)) }}? 10.09.2019
  • Это работает! Теперь style="background-image:url({{ Image(page.meta('hero_image')).src }})" работает как положено. Поле изображения в ACF может быть установлено либо на массив, либо на идентификатор, оба работают. На самом деле спасибо за это, было неочевидно думать об использовании страницы вместо публикации, так как в WP страницы также есть сообщения, а документы Timber не содержат этой ссылки ни в одном из примеров, которые я просматривал. Пожалуйста, добавьте это как правильный ответ. 10.09.2019
  • Привет, Ян! Круто, у вас все заработало! В этом нет ничего специфического для WordPress или Timber. Вы можете сами определить, устанавливаете ли вы $context['post'] или $context['page']. 10.09.2019
  • Большое спасибо :) Еще один кусок головоломки заполнен .. 10.09.2019

Ответы:


1

Если у вас есть {{ Image(post.meta('hero_image')).src }} в вашем файле Twig, Twig будет искать переменную post. В вашем случае вы определяете переменную сообщения, когда просматриваете свои сообщения, чтобы отображать их в виде карточек.

{% for post in posts %}
    {% include "blogpost-card.twig" %}
{% endfor %}

Однако вы, вероятно, не определили настраиваемое поле под названием hero_image для своих сообщений, а на странице, где вы их показываете. Таким образом, когда вы определяете свой контекст и добавляете отображаемый в данный момент пост в page в контексте, то позже вам нужно будет получить к нему доступ также через page, а не через post.

$context = Timber::get_context();
$context['page'] = new Timber\Post();
<div
     class="image image-overlay"
     style="background-image:url({{ Image(page.meta('hero_image')).src }})"
></div>
10.09.2019

2

Что касается переменных ACF, вы просто добавляете их в свой functions.php, и вы должны его раскачивать - кто-нибудь поправит меня, если я ошибаюсь.

  class StarterSite extends Timber\Site {
        /** Add timber support. */
        public function __construct() {
            //maybe you already have this part in your functions file
            add_action( 'after_setup_theme', array( $this, 'theme_supports' ) );
            add_filter( 'timber_context', array( $this, 'add_to_context' ) );
            add_filter( 'get_twig', array( $this, 'add_to_twig' ) );
            add_action( 'init', array( $this, 'register_post_types' ) );
            add_action( 'init', array( $this, 'register_taxonomies' ) );
            parent::__construct();
        }

        public function add_to_context( $context ) {
            //left side: define how the variable is named to grab them in the TWIG files
            //right side: grabing the ACF variable-name
            $context['site'] = $this;
            $context['menu'] = new Timber\Menu("Main Menu");
            $context['something'] = new Timber\Menu("something_acf_name");
            $context['foo'] = new Timber\Menu("bar");
            $context['my_custom_button_name'] = new Timber\Menu("acf_custom_button_name");
            // Posts with the category name "featured" for the slideshow

            //
            return $context;
        }
    }

Итак, предположим, что мы находимся в файле index.twig (или в любом другом, если вы определили его в файле functions.php), вы можете просто получить свою переменную следующим образом:

<div>
{{ foo }}
</div>

Надеюсь, это то, что вы искали. Вы также можете просто назначить переменные, например, в файле index.php, тогда они не будут доступны глобально (на каждой странице). Это может быть хорошо, чтобы держать ваш беспорядок под контролем. На самом деле зависит от того, что вы строите.

08.09.2019
  • Насколько я понял из документации, нет необходимости явно задавать переменные ACF таким образом. В этом случае в вашем коде должно быть указано new Timber \ Image, а не Timber \ Menu. Но да, каким-то образом $ context не передает поле в файл Twig. 09.09.2019
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..