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