Помогите с кодом для ВП (вывести текст на старнице записи)

gukkko
На сайте с 10.03.2013
Offline
62
390

Ребят, помогите с кодом для ВП.

Проблема такая. Для всех публикаций с определенной к категории нужно через 5 дней после публикации вывести ссылки на статьи по определенному тегу.

Логика такая: Публикуем статью как обычно в категории "запеканки", через 5 дней в этой статье появляются все ссылки публикации, которые содержат тег "пирожки".

Gerga
На сайте с 02.08.2015
Offline
94
#1

gukkko, примерно так.

В functions.php:


/**
* Функция возвращает записи из указанной метки
* если текущая запись является старой и запись входит в указанную категорию
*
* @param int $tag_id - id метки из которой нужно получить записи.
* @param int|array $category - id категорий.
* @return WP_Post[] массив объектов записей.
**/
function theme_get_correct_posts($tag_id = null, $category = null) {
if (!$tag_id || !is_old_post() || !in_category($category)) {
return null;
}

$posts = get_posts(array(
'tag_id' => $tag_id,
));

return $posts;
}

/**
* Функция отвечает на вопрос: Является ли запись старой?
*
* @param int|WP_Post $post id записи или объект записи.
* @return bool истина, если запись опубликована больше 5 дней назад.
**/
function theme_is_old_post($post = null) {
$post = get_post($post);

if (!$post) {
return false;
}

$period = DAY_IN_SECONDS * 5;

$from = get_post_time('U');
$to = current_time('timestamp');

$diff = (int) abs($to - $from);

return $diff > $period;
}

В single.php примерно так:


<?php if ($posts = theme_get_correct_posts(id_метки, id_категории)) : ?>
<div class="list-posts">
<?php
foreach($posts as $post) {
setup_postdata($post);
get_template_part('путь_к_шаблону_вывода_записи');
}

wp_reset_postdata();
?>
</div>
<?php endif; ?>

Вместо "id_метки" вставляете id метки, вместо "id_категории" вставляете id категории, вместо 'путь_к_шаблону_вывода_записи' вставляете путь к шаблону вывода записей в цикле соответственно.

Функция "theme_get_correct_posts" должна вызываться после функции установки записи.

gukkko
На сайте с 10.03.2013
Offline
62
#2

Gerga, все сделал, но не работает, показывается как шаблон в шаблоне страница записи. Скорее всего, дело в том что я указал неправильно get_template_part('путь_к_шаблону_вывода_записи'); как я понимаю.

Я указал

get_template_part('content', 'single');

и не работает, я так понял для этого нужно создать новый файлик в шаблоне ВП и прописать путь на него?

Gerga
На сайте с 02.08.2015
Offline
94
#3
gukkko:
и не работает, я так понял для этого нужно создать новый файлик в шаблоне ВП и прописать путь на него?

Верно, если такого нет. Например шаблон get_template_part('content', 'single'); предназначен для вывода одиночной записи. В archive.php или category.php можете узнать, какой шаблон используется для вывода списка записей в вашей теме.

Gerga:
if (!$tag_id || !is_old_post() || !in_category($category)) {

тут получилась ошибка, вместо "is_old_post" нужно "theme_is_old_post".

gukkko
На сайте с 10.03.2013
Offline
62
#4

Gerga, поправил все работает, ссылки на статьи выводятся. Только есть одна проблема, этот блок дублируется 3 раза на странице подряд, как это можно исправить?. А так все отлично, спасибо большое.

Gerga
На сайте с 02.08.2015
Offline
94
#5

gukkko, покажите содержание файла single.php

gukkko
На сайте с 10.03.2013
Offline
62
#6

Gerga, у меня это файл content-single.php

<?php /* Default template for displaying content. */ ?>

<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<?php
if ( function_exists('yoast_breadcrumb') ) {
yoast_breadcrumb( '<p id="breadcrumbs">','</p>' );
}
?>
<header class="entry-header clearfix"><?php
the_title('<h1 class="entry-title">', '</h1>');
?>
</header>

<div class="post-content"><br/>

<div class="entry-content clearfix"><?php

the_content(); ?>
</div>



<?php if ($posts = theme_get_correct_posts(41, 4)) : ?>
<div class="list-posts">
<?php
foreach($posts as $post) {
setup_postdata($post);
get_template_part('content', 'tagsinfo');
}

wp_reset_postdata();
?>
</div>
<?php endif; ?>


<?php
the_tags('<div class="entry-tags clearfix"><i class="fa fa-tag"></i><ul><li>','</li><li>','</li></ul></div>');
dynamic_sidebar('posts-2'); ?>
</article>

На всякий случай ниже single.php

<?php get_header(); ?>

<div class="mh-wrapper clearfix">
<div id="main-content" class="mh-content" role="main" itemprop="mainContentOfPage"><?php
while (have_posts()) : the_post();
mh_before_post_content();
get_template_part('content', 'single');

comments_template();
endwhile; ?>
</div>
<?php get_sidebar(); ?>
</div>
<?php get_footer(); ?>
Gerga
На сайте с 02.08.2015
Offline
94
#7

gukkko, значит для get_posts нужно указать numberposts => 1. Так должно получиться:


$posts = get_posts(array(
'tag_id' => $tag_id,
'numberposts' => 1,
));
gukkko
На сайте с 10.03.2013
Offline
62
#8

Gerga, идеально, все работает. Еще раз спасибо большое, очень помогли!

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий