Как изменить привязку id рубрики?
Всем добрый день! Сделал показ блока на странице записи при условии что эта запись имеет назначенную рубрику с id 88, но не могу придумать как заменить этот привязанный id на значение указанное в поле acf на странице редактирования блока в админке.
Регистрация типа записи и поля ACF
function register_promo_type() { register_post_type('promo', array( 'labels' => array( 'name' => 'Промо', 'singular_name' => 'Промо', ), 'public' => true, 'supports' => array('title'), 'has_archive' => false, 'menu_icon' => 'dashicons-megaphone', )); } add_action('init', 'register_promo_post_type'); if( function_exists('acf_add_local_field_group') ): acf_add_local_field_group(array( 'key' => 'group_promo', 'title' => 'Настройки', 'fields' => array( array( 'key' => 'field_promo_taxonomy_id', 'label' => 'ID Таксономии', 'name' => 'promo_taxonomy_id', 'type' => 'text', ), ), 'location' => array( array( array( 'param' => 'post_type', 'operator' => '==', 'value' => 'promo', ), ), ), )); |
function register_promo_type() { register_post_type('promo', array( 'labels' => array( 'name' => 'Промо', 'singular_name' => 'Промо', ), 'public' => true, 'supports' => array('title'), 'has_archive' => false, 'menu_icon' => 'dashicons-megaphone', )); } add_action('init', 'register_promo_post_type'); if( function_exists('acf_add_local_field_group') ): acf_add_local_field_group(array( 'key' => 'group_promo', 'title' => 'Настройки', 'fields' => array( array( 'key' => 'field_promo_taxonomy_id', 'label' => 'ID Таксономии', 'name' => 'promo_taxonomy_id', 'type' => 'text', ), ), 'location' => array( array( array( 'param' => 'post_type', 'operator' => '==', 'value' => 'promo', ), ), ), ));
Функция для показа блока в записи с рубрикой
function display_promo_after_content($content) { if (is_singular('post')) { $current_post = get_queried_object(); $taxonomy_id = get_field('promo_taxonomy_id'); if (has_term(88, 'category', $current_post)) { $args = array( 'post_type' => 'promo, 'posts_per_page' => -1, ); $promo_blocks = new WP_Query($args); if ($promo_blocks->have_posts()) { while ($promo_blocks->have_posts()) { $promo_blocks->the_post(); $title = get_field('promo_title'); $subtitle = get_field('promo_subtitle'); $button_text = get_field('promo_button_text'); $button_link = get_field('promo_button_link'); $title_color = get_field('promo_title_color'); $subtitle_color = get_field('promo_subtitle_color'); $button_bg_color = get_field('promo_button_bg_color'); $bg_color = get_field('promo_bg_color'); $border_color = get_field('promo_border_color'); $promo_html = '<div class="container" style="background-color: ' . esc_attr($bg_color) . '; border: 1px solid ' . esc_attr($border_color) . ';">'; $promo_html .= '<div class="column">'; $promo_html .= '<h2 style="color: ' . esc_attr($title_color) . ';">' . esc_html($title) . '</h2>'; if (!empty($subtitle)) { $promo_html .= '<p style="color: ' . esc_attr($subtitle_color) . ';">' . esc_html($subtitle) . '</p>'; } $promo_html .= '</div>'; $promo_html .= '<div class="column">'; if (!empty($button_text) && !empty($button_link)) { $promo_html .= '<a href="' . esc_url($button_link) . '" class="btn" style="background-color: ' . esc_attr($button_bg_color) . ';">' . esc_html($button_text) . '</a>'; } $promo_html .= '</div>'; $promo_html .= '</div>'; $content .= $promo_html; } wp_reset_postdata(); } } } return $content; } add_filter('the_content', 'display_blocks_after_content'); |
function display_promo_after_content($content) { if (is_singular('post')) { $current_post = get_queried_object(); $taxonomy_id = get_field('promo_taxonomy_id'); if (has_term(88, 'category', $current_post)) { $args = array( 'post_type' => 'promo, 'posts_per_page' => -1, ); $promo_blocks = new WP_Query($args); if ($promo_blocks->have_posts()) { while ($promo_blocks->have_posts()) { $promo_blocks->the_post(); $title = get_field('promo_title'); $subtitle = get_field('promo_subtitle'); $button_text = get_field('promo_button_text'); $button_link = get_field('promo_button_link'); $title_color = get_field('promo_title_color'); $subtitle_color = get_field('promo_subtitle_color'); $button_bg_color = get_field('promo_button_bg_color'); $bg_color = get_field('promo_bg_color'); $border_color = get_field('promo_border_color'); $promo_html = '<div class="container" style="background-color: ' . esc_attr($bg_color) . '; border: 1px solid ' . esc_attr($border_color) . ';">'; $promo_html .= '<div class="column">'; $promo_html .= '<h2 style="color: ' . esc_attr($title_color) . ';">' . esc_html($title) . '</h2>'; if (!empty($subtitle)) { $promo_html .= '<p style="color: ' . esc_attr($subtitle_color) . ';">' . esc_html($subtitle) . '</p>'; } $promo_html .= '</div>'; $promo_html .= '<div class="column">'; if (!empty($button_text) && !empty($button_link)) { $promo_html .= '<a href="' . esc_url($button_link) . '" class="btn" style="background-color: ' . esc_attr($button_bg_color) . ';">' . esc_html($button_text) . '</a>'; } $promo_html .= '</div>'; $promo_html .= '</div>'; $content .= $promo_html; } wp_reset_postdata(); } } } return $content; } add_filter('the_content', 'display_blocks_after_content');
Просьба подсказать или направить в нужную сторону, сам что-то не могу сообразить
Дополнительно:
Ошибка молотка. Опиши конечную задачу.
Ответы:
как заменить этот привязанный id на значение указанное в поле acf
Наверно, поменять 88 на get_field('promo_taxonomy_id').
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Не привязывайтесь к жёсткому ID рубрики в коде. Если в ACF на странице редактирования промо-блока выбирается рубрика, получите выбранный термин из поля и проверяйте текущую запись через
has_category()илиhas_term().Если поле ACF возвращает ID термина:
$category_id = (int) get_field('promo_category', $promo_id); if ($category_id && has_category($category_id, get_the_ID())) { // вывести промо-блок }
Если поле возвращает объект термина:
$term = get_field('promo_category', $promo_id); if ($term && has_category((int) $term->term_id, get_the_ID())) { // вывести промо-блок }
Если это не стандартные рубрики, а кастомная таксономия, используйте
has_term():$term = get_field('promo_term', $promo_id); if ($term && has_term((int) $term->term_id, 'your_taxonomy', get_the_ID())) { // вывести блок }
В настройках ACF для поля выбора рубрики лучше использовать тип Taxonomy. В Return Format выберите Term Object или Term ID и дальше пишите код под выбранный формат.
Если промо-блоков несколько, можно сделать запрос всех опубликованных promo и для каждого проверить выбранную рубрику. Но следите за производительностью: не делайте тяжёлый запрос в каждом месте шаблона без кэша.
И ещё: если блок должен показываться для нескольких рубрик, настройте ACF Taxonomy field с multiple select. Тогда проверка будет проходить по массиву ID. Это гибче, чем одно поле и жёсткий ID в PHP.