Вопрос или проблема
Я использую API, который отслеживает метрики на частях моего сайта. Единственная полезная информация, которую он сохраняет, это URL (перманентная ссылка).
Каков самый эффективный способ запросить все посты, соответствующие этим перманентным ссылкам, учитывая тот факт, что у меня нет доступа к ID для использования post__in
с WP_Query
?
Существует несколько способов достичь этого, в зависимости от структуры перманентных ссылок ваших постов. Предположим, что слаг поста является частью структуры перманентной ссылки, вы можете получить слаг поста из URL поста и получить соответствующий пост, используя WP_Query
с параметром name
. Предположим, что структура URL выглядит так: http://example.com/{post_slug}/
. Мы можем получить слаг, используя parse_url, и запросить посты с этим слагом:
$url="http://example.com/my-post/";
$path = parse_url( $url, PHP_URL_PATH ); // Получаем путь URL из URL
$slug = trim( $path, "https://wordpress.stackexchange.com/" ); // Убираем слэши
$posts_query = new WP_Query( array(
'name' => $slug
) );
if ( $posts_query->have_posts() ) {
$postid = $posts_query->posts[0]->ID;
}
Ответ или решение
Чтобы получить список постов по пермиллинкам, вам потребуется извлечь слаг (slug) из каждого URL и использовать его для выполнения запроса к базе данных WordPress. В этом ответе приведем пошаговое руководство для достижения этой цели.
-
Извлечение слага из URL:
Чтобы получить слаг из пермиллинка, можно использовать функциюparse_url
, которая разберет URL и извлечет путь. -
Использование WP_Query для получения постов:
Используя извлеченный слаг, вы можете сформировать запрос с помощью классаWP_Query
, указывая параметрname
, который позволяет получить посты по слагам.
Вот пример кода, который демонстрирует это:
// Предположим, у вас есть массив URL
$urls = array(
"http://example.com/my-first-post/",
"http://example.com/my-second-post/",
"http://example.com/my-third-post/",
);
$posts = array();
foreach ($urls as $url) {
// Извлекаем путь из URL
$path = parse_url($url, PHP_URL_PATH);
// Получаем слаг, убирая начальные и конечные слэши
$slug = trim($path, '/');
// Создаем новый WP_Query для поиска поста по слагу
$posts_query = new WP_Query(array(
'name' => $slug,
'post_type' => 'post', // Убедитесь, что указываете правильный тип поста
'posts_per_page' => 1 // Получаем только один пост
));
// Проверяем, есть ли посты в результате
if ($posts_query->have_posts()) {
while ($posts_query->have_posts()) {
$posts_query->the_post();
// Сохраняем данные о посте (например, ID, заголовок)
$posts[] = array(
'ID' => get_the_ID(),
'title' => get_the_title(),
'url' => get_permalink()
);
}
// Сбрасываем глобальную переменную поста после цикла
wp_reset_postdata();
}
}
// Здесь вы можете работать с массивом $posts
foreach ($posts as $post) {
echo "ID: " . $post['ID'] . ", Title: " . $post['title'] . ", URL: " . $post['url'] . "<br />";
}
Объяснение кода:
- Мы создаем массив с URL-адресами.
- В цикле
foreach
мы извлекаем слаг из каждого URL с помощьюparse_url
иtrim
. - Далее мы формируем объект
WP_Query
, передавая слаг в параметреname
. - Если пост найден, мы добавляем его данные в массив
$posts
. - После завершения цикла мы можем использовать массив, чтобы отображать или обрабатывать данные о постах.
Этот метод достаточно эффективен для извлечения постов на основе пермиллинков, так как вам не нужно заранее обладать идентификаторами постов. Просто помните, что каждый запрос к базе данных может занять время, поэтому если у вас много URL-адресов, может быть полезно оптимизировать код для уменьшения количества запросов (например, используя один запрос для выборки всех постов за один раз).