7506
Стояла задача на странице 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 для вывода выбранных записей из админки. Функция имеет два параметра:
$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') отвечают за вывод произвольных полей для проектов и портфолио соотвественно.
Популярные записи