Загрузка сайта makevladakevlad
Создание сайтов

19

янв
2020

2097

Wordpress вывод записей на странице

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

Открываем файл functions.php и добавляем функцию listpage. Данная функция будет выводить все проекты из категории 1 и 5

Функция вывода всех записей на странице редактирование в админке

Функция, которая будет выводить название всех проектов(записей из рубрики 1 и 5) для выбора через <input type='checkbox'>

function makevlad_page($post) {
	wp_nonce_field( basename( __FILE__ ), 'seo_metabox_nonce' );
	$result=query_posts( array('posts_per_page' => 110, 'category__in' => array($metabox['args']['arg2'],$metabox['args']['arg3'])));
	$idMain = get_the_ID();
	foreach($result as $res){
		$check ="";	
		$title = $res->post_title;
		$id = $res->ID;
		$name = $metabox['args']['arg1'].$id;
		if(get_post_meta($idMain, $name, 1)==1)
				$check = "checked='checked'";
		$html .= "<input type='hidden' name='extra[$name]' value=''><label style='display: block;'><input type='checkbox' name='extra[$name]' value='1' $check/>$title</label>";
	}
	print $html;		
}

Комментарий к коду

Дам небольшое пояснение к функции. Получаем все записи 1 и 5 категорий  запрос через функцию query_posts(строка 3). Получаем id текущей страницы и записи, на которой будут выводить проекты(строка 5). Запускаем обработчик через foreach и получаем для каждого проекта id, title и произвольное поле. Задаю имя из слова pager и id текущего проекта.

$name = "pager".$id;

Через условие проверяем - выбран ли проект для отображения на создаваемой странице или записи. Если выбрано, то ставим checked

if(get_post_meta($idMain, $name, 1)==1) 
$check = "checked='checked'";

Собираем checkbox в переменную $html и выводим.

$html .= "<input type='hidden' name='extra[$name]' value=''><label style='display: block;'><input type='checkbox' name='extra[$name]' value='1' $check/>$title</label>";

Подключаем вывод записей из рубрики в админки

Добавляем функцию для вывода всех проектов и их выбора через checkbox. Переменные $callback_args1 и $callback_args2 содержат 3 аргумента - метка(pager и portfolio), id первой и второй рубрики. Вызываем стандартаную функцию WordPress add_meta_box с параметрами. Третий параметр - наша функцию makevlad_page. Последний параметр - аргументы для функции makevlad_page. Остальные параметры можно посмотеть в документации функции, они остались стандартнымми.

add_action( 'add_meta_boxes', 'true_meta_boxes' );
function makevlad_meta_boxes() {
    $callback_args1 = array('arg1'=>"pager", 'arg2'=>1, 'arg3'=>5);
	$callback_args2 = array('arg1'=>"portfolio", 'arg2'=>4, 'arg3'=>6);
	add_meta_box('truediv2', 'Тайтл блока1', 'listpage', '', 'side', 'default', $callback_args1);
	add_meta_box('truediv4', 'Тайтл блока2', 'listpage', '', 'side', 'default', $callback_args2);
}

Сохраняем выбранные записи на странице редактирование в админке

Необходимо сделать сохранение выбранных проектов на странице
add_action('save_post', 'makevlad_save_meta');

function makevlad_save_meta ( $post_id ) {
	// проверяем, пришёл ли запрос со страницы с метабоксом
	if ( !isset( $_POST['seo_metabox_nonce'] )
	|| !wp_verify_nonce( $_POST['seo_metabox_nonce'], basename( __FILE__ ) ) )
        return $post_id;
	// проверяем, является ли запрос автосохранением
	if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) 
		return $post_id;
	// проверяем, права пользователя, может ли он редактировать записи
	if ( !current_user_can( 'edit_post', $post_id ) )
		return $post_id;
	// теперь также проверим тип записи	
	$post = get_post($post_id);
	$_POST['extra'] = array_map( 'sanitize_text_field', $_POST['extra'] );
	foreach( $_POST['extra'] as $key => $value ){
		if(empty($value)){
			delete_post_meta( $post_id, $key ); // удаляем поле если значение пустое
			continue;
		}
		update_post_meta( $post_id, $key, $value ); // add_post_meta() работает автоматически
	}
	return $post_id;
}

Вывод всех записей на странице сайта

Функция makevlad_view для вывода выбранных записей из админки. Функция имеет два параметра:

  • $id - страницы, на которой идет вывод
  • $metrka - нужна для вывода не только проектов, но и для вывода портфолио

$metka необходимо чтобы использовать данную функцию не только для отображения выбранных записей проектов, но и для вывода выбранных записей портфолио.

$array = get_post_meta($id);
	$stack = array();
	foreach( $array as $key => $value ){
		$pos = strpos($key, $metka);
		if ($pos !== false) {
			$bodytag = str_replace($metka, "", $key);
			array_push($stack, $bodytag);
		}
	}
	foreach( $stack as $list ){
		$nofollowOut=$tag=$tag2="";
		$index = " ".get_post_meta($list, 'robotmeta', 1);
		$noindex = strpos($index, 'noindex');
		$nofollow = strpos($index, 'nofollow');
		if($noindex >0){
			$tag = '<noindex>';
			$tag2 = '</noindex>';
		}
		if($nofollow >0)
			$nofollowOut = 'rel="nofollow"';
		print $tag;
		$img = urlSingleImgProject('large', $list);
		if($img=="")
			$img="/wp-content/themes/karkas/images/dom.jpg";
		$title = get_the_title($list);?>
		
<article class="articleWorks">
			<a href="<?php the_permalink($list); ?>" <?print $nofollowOut;?>>
				
<div class="header" style="background-image:url(<? print $img;?>);"></div>

				
<div class="main">

<?php print $title;?>
</div>

				<?if($metka=='pager'){?>
					

<i class="fa fa-home" aria-hidden="true"></i>Общая площадь - <span><? echo get_post_meta($list, 'Площадь', true);?></span>

					

<i class="fa fa-money" aria-hidden="true"></i>Стоимость строительства: <? $price = get_post_meta($list, 'Цена', true); if(!empty($price)) echo number_format($price, 0, ',', ' ')?> руб.

				<?} if($metka=='portfolio'){ ?>

<i class="fa fa-home" aria-hidden="true"></i>Адрес объекта - <span><? echo get_post_meta($list, 'Адрес', true);?></span>

<? }?>
				
<div class="foot">Подробнее</div>

			</a>
		</article>

		<? print $tag2;   }
}

Комментарий к коду

Получаем массив произвольных полей текущий страницы

$array = get_post_meta($id);

Делаем выборку произвольных полей по $metka с названием checkbox и собираем в массив $stack.

 
foreach( $array as $key => $value ){
	$pos = strpos($key, $metka);
	if ($pos !== false) {
	   $bodytag = str_replace($metka, "", $key);
	    array_push($stack, $bodytag);
	}
}

Данный кусок кода отвечает за индексацию выбранного проекта на странице и в целом странице с проектом. Используется по требованием сайта и можно не добавлять в код. Функция получает urlSingleImgProject полный путь к картинке текущего проекта.

foreach( $stack as $list ){
		$nofollowOut=$tag=$tag2="";
		$index = " ".get_post_meta($list, 'robotmeta', 1);
		$noindex = strpos($index, 'noindex');
		$nofollow = strpos($index, 'nofollow');
		if($noindex >0){
			$tag = '<noindex>';
			$tag2 = '</noindex>';
		}
		if($nofollow >0)
			$nofollowOut = 'rel="nofollow"';
		print $tag;
		$img = urlSingleImgProject('large', $list);

Дальше идет обычная верстка для вывода всех выбранных проектов на сайте страницы. if($metka=='pager') и if($metka=='portfolio') отвечают за вывод произвольных полей для проектов и портфолио соотвественно.

counter