Вопрос или проблема
Я в полном замешательстве и надеюсь, что это что-то глупое, чего я просто не могу увидеть, потому что слишком близок к этому.
Работаю над LMS, используя Sensei. Пытаюсь получить course_id из урока. Весьма просто, это просто метаданные в пользовательском типе записи.
Свел все к этому простому утверждению:
echo 'Курс ID: ' . get_post_meta(17234, '_lesson_course', true);
Я проверил базу данных, данные определенно там:
И есть только одно совпадение.
Но он всегда возвращает пустую строку (или пустой массив, если я установлю последний аргумент в false).
Провел еще некоторые исследования. Обнаружил, что моя проблема в моей новой функции, но я не знаю, почему.
Вот весь беспорядок:
function search_results_per_page( $query ) {
echo 'Проверка';
if ( $query->is_search() ) {
$accessible_post_ids = get_accessible_post_ids();
$query->set('post__in', $accessible_post_ids);
}
return $query;
}
add_action( 'pre_get_posts', 'search_results_per_page' );
function get_accessible_post_ids() {
$allowed_posts = [];
$user_id = get_current_user_id();
$args = array('posts_per_page' => -1, 'post_type' => array('lesson', 'course', 'page'));
$search_posts = new WP_Query($args);
while($search_posts->have_posts()) {
$search_posts->the_post();
$post_type = get_post_type();
$post_id = get_the_id();
switch($post_type) {
case 'lesson':
echo 'Post ID: ' . $post_id;
$course_id = get_post_meta($post_id, '_lesson_course', true);
echo ' Course ID: ' . $course_id . '<br>';
if(sensei_has_user_started_course($course_id, $user_id)) {
$allowed_posts[] = $post_id;
}
break;
case 'course':
if(sensei_has_user_started_course($post_id, $user_id)) {
$allowed_posts[] = $post_id;
}
break;
default:
$allowed_posts[] = $post_id;
break;
}
}
wp_reset_postdata();
return $allowed_posts;
}
По какой-то причине, как только я нахожусь внутри цикла while, get_post_meta больше не работает. Я отчасти ожидал, что цикл while не сработает, потому что кажется, что он может быть бесконечно повторяющимся циклом с фильтром, но он, похоже, работает. Просто get_post_meta возвращает пустую строку.
Есть какие-нибудь блестящие мысли?
Редактировать
Недопустимый ответ
Ответ ниже недействителен, так как get_the_id() и get_the_ID() оба возвращают необходимый ID записи внутри цикла. Спасибо @Jess_Pinkman за указание на это.
Ваш код должен работать нормально, но единственная проблема в том, что вы используете неправильную функцию для получения ID записи внутри цикла.
Чтобы получить ID записи внутри цикла, вам нужно использовать функцию get_the_ID().
Что вы используете, это get_the_id(), когда, на самом деле, это get_the_ID(). В этом есть большая разница.
$post_id = get_the_id(); // Это ничего не вернет, так как функция
// даже не существует, следовательно, $post_id
// будет пустым.
Поскольку get_the_id() ничего не возвращает, переменная $post_id остается пустой. Поэтому, когда функция get_post_meta() запускается, она не знает, метаданные какой записи получать, так как ID не указан. Если бы вы включили режим отладки WordPress, он бы даже выдал вам несколько ошибок.
Чтобы получить метаданные, вам нужно использовать правильную функцию, т.е. get_the_ID(), как указано ниже.
$post_id = get_the_ID();
.
Ответ или решение
Конечно! Давайте разберемся в проблеме.
Фон Проблемы
У вас возникла проблема с получением метаданных поста в WordPress, где функция get_post_meta
возвращает пустую строку, несмотря на то, что данные в базе данных присутствуют. Вы работаете с системой управления обучением (LMS) на основе плагина Sensei и пытаетесь получить идентификатор курса из урока, который является пользовательским типом записи.
Анализ Предоставленного Кода
Код, который вы предоставили, состоит из двух функций. Первая функция — search_results_per_page
— изменяет результаты поиска на основе доступных идентификаторов постов. Вторая функция — get_accessible_post_ids
— фактически производит поиск по доступным постам и должна возвращать массив идентификаторов постов.
Ошибка в Коде
Проблема заключается в том, что вы используете функцию get_the_id()
вместо get_the_ID()
внутри цикла while
, проходящего по полученным постам. get_the_id()
не является валидной функцией в WordPress и не возвращает никакого значения, в результате чего переменная $post_id
остается пустой.
Решение Проблемы
Чтобы исправить ошибку, замените строку:
$post_id = get_the_id();
на корректную версию:
$post_id = get_the_ID();
Короткое резюме: внутри цикла необходимо использовать корректную функцию получения ID текущего поста, что позволит функции get_post_meta
корректно получать метаданные.
Практический Советы
-
Включение режима отладки: Для более детального анализа ошибок в WordPress, рассмотрите возможность включения режима отладки (
WP_DEBUG
), что позволит выявить другие потенциальные проблемы в коде. -
Документирование кода: Регулярно документируйте свой код для лучшего понимания и облегчения поиска ошибок. Это особенно полезно, когда работаешь в команде.
-
Проверка имен функций: Постоянно проверяйте правильность написания имён функций и методов API, чтобы избежать подобных ошибок в будущем.
Данная информация поможет вам скорректировать код и решить проблему с достоверным извлечением метаданных из пользовательских типов записей в WordPress. Если проблема сохраняется, возможно, потребуется глубже изучить логи работы WordPress и плагина Sensei.