Создание единственного экземпляра пользовательского типа записи с ограниченными параметрами модуля с использованием ACF и WPGraphQL

Вопрос или проблема

Здравствуйте, сообщество WordPress,

Я работаю над проектом, в котором мне нужно создать настраиваемый тип записи, используя Advanced Custom Fields (ACF), и запрашивать его через WPGraphQL для интеграции с Headless Next.js. Конкретно, я хочу достичь следующего:

  • Единичный экземпляр настраиваемого типа записи: я хочу создать настраиваемый тип записи под названием “Главная страница”, который позволит существовать только одному экземпляру. Этот единственный экземпляр будет представлять главную страницу сайта.

  • Ограниченные варианты модулей: в пределах этого настраиваемого типа записи “Главная страница” я хотел бы ограничить редактора возможностью добавления только заранее определенного набора модулей (например, секция героя, избранные записи, галерея и т.д.). Цель состоит в том, чтобы предоставить структурированный и контролируемый опыт редактирования.

  • Интеграция с WPGraphQL: как только настраиваемый тип записи “Главная страница” будет настроен с ограниченными вариантами модулей, я намерен запрашивать эти
    данные с помощью WPGraphQL, чтобы извлечь и отобразить их в Headless
    Next.js фронтенде.

Я уже зарегистрировал настраиваемый тип записи с помощью ACF, но не уверен, как обеспечить ограничение на единичный экземпляр и ограничить варианты модулей для редактора. Кроме того, буду признателен за любые рекомендации о том, как эффективно запрашивать данные этого настраиваемого типа записи через WPGraphQL для бесшовной интеграции с Next.js.

Буду очень признателен за любые советы, примеры кода или ресурсы, касающиеся достижения этих целей!

Заранее спасибо за вашу помощь.

С наилучшими пожеланиями,

J

Настраиваемые типы записей просто не работают так, как вы хотите. Типы “постов” по своей сути являются повторяющимися типами. Моя рекомендация — использовать существующий тип записи “Страница” для создания главной страницы. Вот несколько основных шагов:

  1. Создайте страницу “Главная” в разделе “Страницы”
  2. В настройках “Чтение” вашего сайта выберите эту страницу в качестве “Главной страницы”Скриншот
  3. Создайте группу полей ACF, которая будет применяться только к этой странице.

Если это не сработает для вас, попробуйте создать “Страницу параметров” с ACF (требуется Pro). Это неповторяющийся тип с единственным экземпляром.

Ответ или решение

Здравствуйте, сообщество WordPress!

Я понимаю вашу задачу по созданию пользовательского поста типа "Homepage" с использованием Advanced Custom Fields (ACF) и WPGraphQL, а также о необходимости интеграции с Headless Next.js. Позвольте мне предоставить вам полное решение для достижения ваших целей.

Создание пользовательского поста типа "Homepage" с ограниченной возможностью

  1. Регистрация пользовательского поста типа:
    Вы можете зарегистрировать свой пользовательский пост типа "Homepage" в файле функции вашего шаблона (обычно это functions.php). Вот пример кода:

    function create_custom_post_type() {
       register_post_type('homepage',
           array(
               'labels' => array(
                   'name' => __('Homepage'),
                   'singular_name' => __('Homepage')
               ),
               'public' => true,
               'has_archive' => false,
               'rewrite' => array('slug' => 'homepage'),
               'supports' => array('title', 'editor', 'custom-fields'),
               'show_in_graphql' => true,
               'graphql_single_name' => 'Homepage',
               'graphql_plural_name' => 'Homepages',
           )
       );
    }
    add_action('init', 'create_custom_post_type');
  2. Ограничение на единственный экземпляр:
    Чтобы убедиться, что вы можете создать только один экземпляр этого пользовательского поста, вы можете дополнительно добавить следующий код, который будет проверять наличие существующего поста и предотвращать создание нового:

    function limit_homepage_instance($post_id) {
       if (get_post_type($post_id) != 'homepage') {
           return;
       }
    
       $existing_homepage = get_posts(array(
           'post_type' => 'homepage',
           'numberposts' => 1,
           'post_status' => 'publish',
       ));
    
       if (count($existing_homepage) > 0 && $existing_homepage[0]->ID != $post_id) {
           wp_delete_post($post_id, true);
       }
    }
    add_action('wp_insert_post', 'limit_homepage_instance');
  3. Настройка полей ACF:
    В интерфейсе ACF создайте группу полей, которая будет относиться исключительно к типу поста "Homepage". Например, вы можете добавить такие поля, как "Герой", "Избранные посты" и "Галерея". Чтобы сделать это:

    • Перейдите в ACF и создайте новую группу полей.
    • Убедитесь, что условия отображения установлены на "Тип поста равен Homepage".
  4. Интеграция с WPGraphQL:
    После того как вы зарегистрировали пользовательский пост и настроили ACF, вы сможете получить доступ к этому посту через WPGraphQL. Для этого убедитесь, что ваш show_in_graphql установлен в true при регистрации пользовательского поста.

    Вы можете запрашивать данные из GraphQL следующим образом:

    {
       homepage {
           title
           content
           customFieldGroup {
               hero {
                   image {
                       sourceUrl
                   }
                   title
               }
               featuredPosts {
                   title
                   excerpt
               }
           }
       }
    }

Резюме

  • Мы зарегистрировали пользовательский пост типа "Homepage".
  • Мы ограничили создание нового экземпляра этого поста.
  • Мы создали поле ACF, привязанное к этому типу поста.
  • Мы настроили WPGraphQL для доступа к этим данным.

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

Надеюсь, эта информация оказалась полезной для вас. Если у вас есть дополнительные вопросы, не стесняйтесь обращаться!

С наилучшими пожеланиями,
[Ваше Имя]

Оцените материал
Добавить комментарий

Капча загружается...