Вывод постов вордпресс за пределами сайта

в 6:14, , рубрики: php, sql, wordpress, метки:

Вывод постов вордпресс за пределами сайта

Задача:

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

Пример реализации вы можете посмотреть на моём сайте game.tobefun.org открыв любую игру.

Как видите я применил этот алгоритм для вывода определённого количества (оно задаётся параметрами вашего окна) случайных миниатюр, которые являются ссылками на записи для которых они заданы.

Шаг 1 — html Документ

Общая структура html-Документа такова:

<!DOCTYPE html>

<html>

<head>
<meta charset="utf-8" />
<script src="http://code.jquery.com/jquery-2.0.0.js"></script>

<!-- Подключаем файл со скриптами -->
<script src="http://game.tobefun.org/play/more.js"></script>
</head>

<body>

<div class="more">
	<span class="more_game" lang="ru"></span>
</div>

</body>
</html>

Шаг 2 — JavaScript и формирование Ajax запроса

Для начала нам нужно определить размеры рабочей области окна браузера. Для этого используем код:

 var width = $(window).width();
 var height = $(window).height();

Затем передаём полученные данные методом POST

 var width = $(window).width();
 var height = $(window).height();

$.post(
		"more.php",			// php-Файл, который принимает данные
	{
		width: logo_width,
		height: height
	},
	onAjaxSuccess			// Функция, которая будет запущена при успешной отправке
	);
	
	function onAjaxSuccess(data)
	{
			// Здесь мы получаем данные, отправленные сервером и выводим их на экран в объекте с id="more_game".
			$("#more_game").html(data);
			// Для правильного ресайзинга добавим динамический параметр высоты объекта
			$('#more_game').css('height', height);
	}

Шаг 3 — PHP — Обработчик

<?php
/* Обрабатываем параметры екрана 
$_POST['height'] - Общая высота
64 - высота одного изображения */
$img_kil = floor($_POST['height']/64); 

/* Если возможно разместить хотя бы обно изображение ... */
if ($img_kil >= 1) { // <- САМЫЙ ПЕРВЫЙ IF

/* Подключаемся к базе данных сайта, с которого хотим вытянуть записи */
$db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASSWORD);  // Подключаемся к Серверу

/*Так как у меня изображение выводятся в три колонки, а количество возможных строк равно $img_kil
То общее количество необходимых постов будет втрое больше */
$k=$img_kil*3;
Шаг 3.1 — SQL запрос для получения ссылок на изображения

Он будет состоять из трёх частей:

1. Запрос на выборку ID's опубликованных записей

SELECT `ID`
FROM	`wp_posts` 
WHERE	`post_type` = 'post'
AND	`post_status` = 'publish'

2. Запрос на выборку ID's фото, которые установлены как миниатюра

SELECT `meta_value` 
FROM `wp_postmeta` 
WHERE `meta_key` = '_thumbnail_id'
AND `post_id` 
	IN ()

3. Запрос на выборку необходимых данных выбранных фото.

SELECT `post_id`, `meta_value`
FROM `wp_postmeta` 
WHERE `post_id` 
	IN ()
ND `meta_key` = '_wp_attachment_metadata'

Общий запрос, который будет выдавай $k случайных записей, выглядит так:

$sql='
	SELECT `post_id`, `meta_value`
	FROM `wp_postmeta` 
	WHERE `post_id` 
	IN (
		SELECT `meta_value` 
		FROM `wp_postmeta` 
		WHERE `meta_key` = '_thumbnail_id'
		AND `post_id` 
			IN (
				SELECT `ID`
				FROM	`wp_posts` 
				WHERE	`post_type` = 'post'
				AND	`post_status` = 'publish'
			)
	)
	AND `meta_key` = '_wp_attachment_metadata'
	ORDER BY RAND()
	LIMIT '.$k;

Теперь нужно его обработать

$stmt = $db->query($sql);
//Установка fetch mode
$stmt->setFetchMode(PDO::FETCH_ASSOC);
while($row = $stmt->fetch())
{
	
	$img_mass = unserialize($row['meta_value']);

/* Переменная $img_mass будет содержать массив такого вида
Array
(
    [width] => 1000
    [height] => 651
    [file] => 2013/01/Ниндзя-черепашки.jpg
    [sizes] => Array
        (
            [thumbnail] => Array
                (
                    [file] => Ниндзя-черепашки-538x350.jpg
                    [width] => 538
                    [height] => 350
                    [mime-type] => image/jpeg
                )

            [medium] => Array
                (
                    [file] => Ниндзя-черепашки-300x195.jpg
                    [width] => 300
                    [height] => 195
                    [mime-type] => image/jpeg
                )

            [yarpp-thumbnail] => Array
                (
                    [file] => Ниндзя-черепашки-120x120.jpg
                    [width] => 120
                    [height] => 120
                    [mime-type] => image/jpeg
                )

        )

    [image_meta] => Array
        (
            [aperture] => 0
            [credit] => 
            [camera] => 
             => 
            [created_timestamp] => 0
            [copyright] => 
            [focal_length] => 0
            [iso] => 0
            [shutter_speed] => 0
            [title] => 
        )

)
*/

	list($year, $mount, $name) = explode("/", $img_mass['file']); 
	/* $img_mass['file']='Развиваем строку 2013/01/Ниндзя-черепашки.jpg' для получения директории в которой находится файл
	$year = '2013'
	$mount = '01'
	$name = 'Ниндзя-черепашки.jpg'*/
		
	$img_dir = $year.'/'.$mount.'/'.$img_mass['sizes']['yarpp-thumbnail']['file'];
	/* Формируем путь к файлу нужного нам размера (в моём случае 'yarpp-thumbnail')*/
	
	$base [] = array ( 'post_id' => $row['post_id'], 'img_dir' => $img_dir);
	/* Сохраняем данные*/
}
Шаг 3.2 — SQL запрос для получения ссылок на записи

$k_post = sizeof($base); // Подсчитаем количество полученных изображений

for ($i=0; $i<$k_post; $i++) {

	/* Формируем запрос для получения записи соодтведствующей данному изображению */
	$sql='	
		SELECT `post_title`, `post_name` 
		FROM `wp_posts` 
		WHERE `ID` 
			IN (
				SELECT `post_id`
				FROM	`wp_postmeta` 
				WHERE  `meta_value` = '.$base[$i]['post_id'].'	
			)';
	
	/* Выполняем его */	
	$stmt = $db->query($sql);
	$stmt->setFetchMode(PDO::FETCH_ASSOC);

	/*Выводим ссылку*/
	while($row = $stmt->fetch()) {
		echo '<a href="http://game.tobefun.org/'.$row['post_name'].'.html" title="'.$row['post_title'].'"><img width="120" height="120" src="http://game.tobefun.org/wp-content/uploads/'.$base[$i]['img_dir'].'"></a>';
	}

}
$db = null; //Закрытие соединения
 } // <- ЗАКРЫВАЕМ САМЫЙ ПЕРВЫЙ IF
 ?>

Автор: Kozack

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js