Включите пользовательские поля в содержимое обычной страницы.

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

Вот моя настройка:

  • Родительская страница “Галерея”: _обычная страница, не пользовательский тип или что-то подобное_
  • Несколько дочерних страниц “Проект” (может быть всего 1, неограниченное количество): тоже обычные страницы

На дочерних страницах будут метабоксы или пользовательские поля для ввода данных в мои предварительно отформатированные области. Мне все равно, будут ли это метабоксы или пользовательские поля, главное, чтобы это было понятно!

Я использую стандартный код, предоставленный WP, чтобы показать заголовки дочерних страниц и the_content на родительской странице.

    <?php
    $mypages = get_pages( array( 'child_of' => $post->ID, 'sort_column' => 'post_date', 'sort_order' => 'desc' ) );

    foreach( $mypages as $page ) {
    $content = $page->post_content;
    if ( ! $content ) // Проверка на пустую страницу
    continue;

    $content = apply_filters( 'the_content', $content );
?>

    <div class="gallery-wrapper">
        <div class="body">
            <div id="zoom">
                <span></span>
                <?php echo $content; ?>
            </div>
            <a href="" rel="lightbox">Нажмите, чтобы увеличить и просмотреть галерею проекта</a>
        </div>

        <div class="sidebar" style="margin-bottom: 30x; padding-top: 20px;">
            <h3><?php echo $page->post_title; ?></h3>
            <p><strong>Цель:</strong> <?php echo get_post_meta($post->ID, 'ecpt_goal', false); ?></p>
            <p><strong>Задача:</strong> <?php echo $ecpt_challenge; ?></p>
            <p><strong>Решение:</strong> <?php echo $ecpt_solution; ?></p>
            <p><strong>Результаты:</strong> <?php echo $ecpt_results; ?></p>
        </div>
    </div>
        <div class="clear-border"> </div>

        <!--- --->
<?php
}   
?>

Ни одна из пользовательских областей не отображается на родительской странице. Я не знаю, как их фильтровать и в идеале хотел бы включить пользовательские поля ИЛИ метабоксы в the_content.

<p><strong>Цель:</strong> <?php echo get_post_meta($post->ID, 'ecpt_goal', false); ?></p>
<p><strong>Задача:</strong> <?php echo $ecpt_challenge; ?></p>

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

Кроме того, если вы знаете, как включить пользовательские поля в the_content, вот что я использую с ACF:

<h3><?php the_field(client_title_1); ?></h3>
<strong>Цель:</strong> <?php the_field(goal_1); ?>
<strong>Задача:</strong> <?php the_field(challenge_1); ?>

И так далее.

Большое спасибо заранее!

ИЗМЕНЕНО ДЛЯ ДОБАВЛЕНИЯ:
Существует ли способ добавить мои пользовательские метабоксы или поля в стандартный набор, чтобы они автоматически включались в the_content без фильтров и хуков?

Где вы устанавливаете $ecpt_challenge, $ecpt_solution и $ecpt_results?

Также get_post_meta($post->ID, 'ecpt_goal', false); возвращает массив, поэтому используйте

print_r ( get_post_meta($post->ID, 'ecpt_goal', false));

ИЛИ для одного результата передайте “true” в последнем аргументе.

 echo get_post_meta($post->ID, 'ecpt_goal', true);

Справка: get_post_meta() @codex

При использовании плагина для добавления пользовательских полей я обычно делаю что-то вроде этого:

var_dump(get_post_custom());

(http://codex.wordpress.org/Function_Reference/get_post_custom)

Я делаю это обычно потому, что каждый (нормальный) плагин добавит префикс к пользовательским полям.
Как только я узнаю имя поля, я могу использовать get_post_meta(), чтобы поместить поле в шаблон.

Тем не менее, используя этот плагин, у вас есть еще более простой подход. Он предоставляет функции, которые помогают вам отображать ваши пользовательские поля: get_field() и the_field().

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

Независимо от того, какой плагин вы используете для пользовательских полей или пользовательских метабоксов, всегда помните о meta_key, например; 'ecpt_goal' для метабокса/пользовательского поля goal.

Чтобы получить сохраненное значение для метабокса/пользовательского поля, вы можете использовать функцию get_post_meta('post_id', 'meta_key', 'single' ). Посетите справку get_post_meta

$goal = get_post_meta( get_the_ID(), 'ecpt_goal', true );
$ecpt_challenge = get_post_meta( get_the_ID(), 'ecpt_challenge', true );
$ecpt_solution = get_post_meta( get_the_ID(), 'ecpt_solution', true );
$ecpt_results = get_post_meta( get_the_ID(), 'ecpt_results', true );

if ( $goal != '' ) {
    echo '<p><strong>Цель : </strong>'.$goal.'</p>';
}
if ( $ecpt_challenge != '' ) {
    echo '<p><strong>Задача : </strong>'.$ecpt_challenge.'</p>';
}
if ( $ecpt_solution != '' ) {
    echo '<p><strong>Решение : </strong>'.$ecpt_solution.'</p>';
}
if ( $ecpt_results != '' ) {
    echo '<p><strong>Результаты : </strong>'.$ecpt_results.'</p>';
}

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

Для того чтобы включить пользовательские поля или метабоксы в содержимое обычной страницы в WordPress, вам нужно убедиться, что вы правильно извлекаете данные из этих полей и используете их в родительской странице для отображения информации о дочерних страницах.

Шаги для реализации

  1. Извлечение пользовательских полей:
    Известно, что get_post_meta() возвращает массив значений, если не указать третий параметр (нужно использовать true для получения единственного значения), поэтому убедитесь, что вы правильно извлекаете ваши метаданные.

    Например, ваш код для извлечения значений пользовательских полей должен выглядеть следующим образом:

    // Получаем ID дочерней страницы
    $child_id = $page->ID;
    
    // Извлекаем пользовательские поля
    $goal = get_post_meta($child_id, 'ecpt_goal', true);
    $ecpt_challenge = get_post_meta($child_id, 'ecpt_challenge', true);
    $ecpt_solution = get_post_meta($child_id, 'ecpt_solution', true);
    $ecpt_results = get_post_meta($child_id, 'ecpt_results', true);
  2. Отображение пользовательских полей на родительской странице:
    Затем вам нужно отобразить эти значения на родительской странице. Ваш код может быть обновлён следующим образом:

    foreach( $mypages as $page ) {
       $content = apply_filters( 'the_content', $page->post_content );
    
       // Получаем мета данные для текущей дочерней страницы
       $goal = get_post_meta($page->ID, 'ecpt_goal', true);
       $ecpt_challenge = get_post_meta($page->ID, 'ecpt_challenge', true);
       $ecpt_solution = get_post_meta($page->ID, 'ecpt_solution', true);
       $ecpt_results = get_post_meta($page->ID, 'ecpt_results', true);
    ?>
       <div class="gallery-wrapper">
           <div class="body">
               <div id="zoom">
                   <span></span>
                   <?php echo $content; ?>
               </div>
               <a href="" rel="lightbox">Click to enlarge and view project gallery</a>
           </div>
           <div class="sidebar" style="margin-bottom: 30px; padding-top: 20px;">
               <h3><?php echo $page->post_title; ?></h3>
               <p><strong>Goal:</strong> <?php echo $goal; ?></p>
               <p><strong>Challenge:</strong> <?php echo $ecpt_challenge; ?></p>
               <p><strong>Solution:</strong> <?php echo $ecpt_solution; ?></p>
               <p><strong>Results:</strong> <?php echo $ecpt_results; ?></p>
           </div>
       </div>
    <?php
    }
  3. Использование ACF (Advanced Custom Fields):
    Если вы используете ACF для работы с пользовательскими полями, вы можете использовать функции get_field() и the_field(). Например:

    $goal = get_field('goal_1', $page->ID);
    $challenge = get_field('challenge_1', $page->ID);
  4. Добавление пользовательских полей в the_content:
    Если вы хотите автоматически добавлять пользовательские поля в содержимое, вам нужно использовать фильтр the_content. Например:

    add_filter('the_content', 'add_custom_fields_to_content');
    
    function add_custom_fields_to_content($content) {
       if (is_page('gallery')) { // Указывайте нужную родительскую страницу
           $custom_fields = '<div class="custom-fields">';
           $custom_fields .= '<p><strong>Goal:</strong> ' . get_post_meta(get_the_ID(), 'ecpt_goal', true) . '</p>';
           $custom_fields .= '<p><strong>Challenge:</strong> ' . get_post_meta(get_the_ID(), 'ecpt_challenge', true) . '</p>';
           $custom_fields .= '<p><strong>Solution:</strong> ' . get_post_meta(get_the_ID(), 'ecpt_solution', true) . '</p>';
           $custom_fields .= '<p><strong>Results:</strong> ' . get_post_meta(get_the_ID(), 'ecpt_results', true) . '</p>';
           $custom_fields .= '</div>';
    
           return $content . $custom_fields;
       }
       return $content;
    }

Следуя этому руководству, вы сможете успешно интегрировать пользовательские поля или метабоксы в содержимое обычной страницы, обеспечивая тем самым удобное отображение информации.

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

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