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

от автора

Задача:

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

Пример реализации вы можете посмотреть на моём сайте 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  ?> 

ссылка на оригинал статьи http://habrahabr.ru/post/180001/


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *