Вопрос или проблема
Я хочу получить содержимое из одного пользовательского поля различных страниц вместе с их заголовками, и я использую следующий код:
<?php
$mypages = get_pages( array(
'sort_order' => 'ASC',
'sort_column' => 'post_title',
'hierarchical' => 1,
'exclude' => '',
'include' => '',
'meta_key' => '',
'meta_value' => '',
'authors' => '',
'child_of' => 53,
'parent' => -1,
'exclude_tree' => '',
'number' => '',
'offset' => 0,
'post_type' => 'page',
'post_status' => 'publish'
) );
foreach( $mypages as $page ) {
$content = $page->post_content;
$new = $page->get_post_custom_values('new_file');
if ( ! $content ) // Проверка на пустую страницу
continue;
$content = apply_filters( 'the_content', $content );
?>
<h2><a href="https://wordpress.stackexchange.com/questions/114633/<?php echo get_page_link( $page->ID ); ?>"><?php echo $page->post_title; ?></a></h2>
<a style="display:block; text-align: center;" title="Скачать сейчас" href="<?php $new; ?>"><img src="<?php bloginfo('template_url'); ?>/images/new-file.png" alt="Скачать файл" /></a>
<?php
}
?>
Я могу получить заголовок страницы, но не получаю значение моих пользовательских полей. Пожалуйста, помогите мне в этом вопросе. Я буду очень признателен за вашу помощь в этом отношении.
Я думаю, что ваша проблема здесь:
$new = $page->get_post_custom_values('new_file');
Вам нужно использовать:
$new = get_post_custom_values('new_file', $page->ID);
Также стоит отметить, что get_post_custom_values() возвращает массив, поэтому $new будет массивом. Я думаю, в вашем случае лучше использовать get_post_meta() следующим образом:
$new = get_post_meta($page->ID, 'new_file', true);
Ответ или решение
Чтобы получить контент из пользовательских полей различных страниц на одной странице и при этом отображать названия этих страниц, вы можете использовать следующий код:
<?php
$mypages = get_pages( array(
'sort_order' => 'ASC',
'sort_column' => 'post_title',
'hierarchical' => 1,
'exclude' => '',
'include' => '',
'meta_key' => '',
'meta_value' => '',
'authors' => '',
'child_of' => 53, // Укажите ID родительской страницы, если нужно
'parent' => -1,
'exclude_tree' => '',
'number' => '',
'offset' => 0,
'post_type' => 'page',
'post_status' => 'publish'
) );
foreach( $mypages as $page ) {
$content = $page->post_content;
// Используем get_post_meta для получения значения пользовательского поля
$new = get_post_meta($page->ID, 'new_file', true);
if ( ! $content ) // Проверяем, пустая ли страница
continue;
$content = apply_filters( 'the_content', $content );
?>
<h2><a href="<?php echo get_page_link( $page->ID ); ?>"><?php echo $page->post_title; ?></a></h2>
<?php if ( ! empty( $new ) ): ?>
<a style="display:block; text-align: center;" title="Download Now" href="<?php echo esc_url( $new ); ?>">
<img src="<?php bloginfo('template_url'); ?>/images/new-file.png" alt="Download the File" />
</a>
<?php endif; ?>
<?php
}
?>
Объяснение изменений:
-
Получение пользовательского поля: В оригинальном коде использовалась строка
$new = $page->get_post_custom_values('new_file');
, что неправильно. Вместо этого вы должны использоватьget_post_meta($page->ID, 'new_file', true);
. Это отправляет запрос к базе данных и возвращает значение пользовательского поляnew_file
для конкретной страницы. -
Проверка на пустое значение: Я добавил проверку, которая отображает ссылку для скачивания только если переменная
$new
не пустая. Это предотвратит отображение пустой ссылки, если пользовательское поле не задано. -
Экранирование URL: Используется функция
esc_url()
для защиты от возможных XSS атак, а также для обеспечения валидных URL.
Этот код правильно извлекает заголовки страниц и соответствующее значение пользовательского поля, и выводит их в аккуратном формате на одной странице.