PHP

Пагинация для WordPress

	// функция пагинации c тонкой настройкой:
	function tweak_pagination($max = 0, $args = array()) {

		// возвращает готовые открывающий и закрывающий тэги
		// на основе имени тэга и классов:
		function get_html_tags($tag, $class_def, $class_custom) {
			$tag_in = ''; $tag_out = '';
			if ($tag != '') {
				$tag_in = '<'. $tag;
				// проверяем классы:
				$class = merge_html_classes($class_def, $class_custom);
				if ($class != '')
					$tag_in .= ' class="' . $class . '"';
				$tag_in .= '>';
				$tag_out = '</' . $tag . '>';
			}
			return array($tag_in, $tag_out);
		}
		// возвращает cырую строчку без лишних пробелов
		// но и без закрывающих кавычек:
		function merge_html_classes($classA, $classB) {
			$out = '';
			// проверяем классы:
			if ($classA != '' || $classB != '') {
				if ($classA != '') $out = $classA;
				if ($classB != '' ) {
					// не забываем пропробельчик :)
					if ($classA != '') $out .= ' ';
					$out .= $classB;
				}
			}
			return $out;
		}

		// если $max равен или меньше нуля - 
		// берём количество страниц из кэша глобального запроса:
		if ($max <= 0 ) {
			global $wp_query;
			$max = $wp_query->max_num_pages;
		}
		// максимальное количество страниц у произвольного запроса:
		$max = ($max > 0) ? $max : 1;
		// получаем номер текущeй страницы из парсинга урла в кэшэ wp_query:
		if ( !$current = get_query_var('paged') ) $current = 1;
		// опции пагинации по умолчанию:
		$defaults = array(
			'base' => str_replace(999999999, '%#%', get_pagenum_link(999999999)),
			'total' => $max,
			'current' => $current,
			'mid_size' => 3, // сколько пунктов показывать слева и справа от текущего
			'end_size' => 1, // сколько пунктов показывать в начале и в конце
			'prev_text' => '«', // текст prev-пункта
			'next_text' => '»', // текст next-пункта
			'type' => 'array',
			// всевозможные тонкие настройки html:
			'wrap' => 'ul', 					// тэг обёртки вокруг пунктов пагинации
			'wrap_def_class' => 'pagination', 	// класс обёртки по умолчанию
			'wrap_class' => '', 				// пользовательские классы обёртки
			'item' => 'li',						// тэг пункта пагинации
			'item_def_class' => '',				// класс пункта пагинации по умолчанию
			'item_class' => '',					// пользовательские классы пункта пагинации
			'curr' => 'li',						// тэг текущего пункта пагинации
			'curr_class' => '',					// класс текущего пункта пагинации
			'prev' => 'li',						// тэг prev-пункта пагинации
			'prev_class' => '',					// класс prev-пункта пагинации
			'next' => 'li',						// тэг next-пункта пагинации
			'next_class' => '',					// класс next-пункта пагинации
			'html' => true,  	// формировать html вокруг встроенной пагинации WP
			'echo' => true 		// сразу выводить
		);
		// получаем настройки пользователя:
		$total = array_merge($defaults, $args);
		// не парсим, если в опциях тип вывода не массив, или парсить не надо
		if ($total['type'] !== 'array' || $total['html'] !== true) {
			if ($total['echo'] === true)
				echo paginate_links($total);
			else return paginate_links($total);
		}
		// формируем тэги обёртки:
		list($wrap_in, $wrap_out) = 
			get_html_tags($total['wrap'], $total['wrap_def_class'], $total['wrap_class']);
		// формируем тэги пунктов пагинации:
		list($item_in, $item_out) =
			get_html_tags($total['item'], $total['item_def_class'], $total['item_class']);
		// формируем тэг текущего пункта:
		$item_class = merge_html_classes($total['item_def_class'], $total['item_class']);
		list($curr_in, $curr_out) =
			get_html_tags($total['curr'], $item_class, $total['curr_class']);
		// формируем тэг prev-пункта:
		list($prev_in, $prev_out) =
			get_html_tags($total['next'], $item_class, $total['prev_class']);
		// формируем тэг next-пункта:
		list($next_in, $next_out) =
			get_html_tags($total['next'], $item_class, $total['next_class']);
		// получаем массив пагинации:
		$paginate = paginate_links($total);
		// если массива нет или он пустой - выходим:
		if (!is_array($paginate) || $paginate === array()) return;
		// формируем html:
		$html = $wrap_in;
		foreach($paginate as $item => $value) {
			if (strpos($value, 'prev') !== false)
				$html .= $prev_in . $value . $prev_out;
			elseif (strpos($value, 'current') !== false)
				$html .= $curr_in . $value . $curr_out;
			elseif (strpos($value, 'next') !== false)
				$html .= $next_in . $value . $next_out;
			else
				$html .= $item_in . $value . $item_out;
		}
		$html .= $wrap_out;
		// выводим или отдаём готовый html:
		if ($total['echo'] === true) echo $html;
		else return $html;
	}
Теги:
php, wordpress
Добавлено: 26 Сентября 2015 14:08:49 Добавил: Roman Sobol Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...