Вопрос или проблема
Мне нужна помощь в модификации этого скрипта. Я пытаюсь также отображать связанные публикации по пользовательским таксономиям и пользовательским типам записей.
//* Определите пользовательский размер изображения для миниатюры в связанных записях
add_image_size( 'related', 300, 0, true );
add_action( 'genesis_after_entry_content', 'child_related_posts' );
/**
* Выводит связанные записи с миниатюрой
*
* @author Nick the Geek
* @url http://designsbynickthegeek.com/tutorials/related-posts-genesis
* @global object $post
*/
function child_related_posts() {
if ( is_singular ( ) ) {
global $post;
$count = 0;
$postIDs = array( $post->ID );
$related = '';
$tags = wp_get_post_tags( $post->ID );
$cats = wp_get_post_categories( $post->ID );
if ( $tags ) {
foreach ( $tags as $tag ) {
$tagID[] = $tag->term_id;
}
$args = array(
'tag__in' => $tagID,
'post__not_in' => $postIDs,
'showposts' => 8,
'ignore_sticky_posts' => 1,
'tax_query' => array(
array(
'taxonomy' => 'post_format',
'field' => 'slug',
'terms' => array(
'post-format-link',
'post-format-status',
'post-format-aside',
'post-format-quote'
),
'operator' => 'NOT IN'
)
)
);
$tag_query = new WP_Query( $args );
if ( $tag_query->have_posts() ) {
while ( $tag_query->have_posts() ) {
$tag_query->the_post();
// $img = genesis_get_image() ? genesis_get_image( array( 'size' => 'related' ) ) : '';
$img = genesis_get_image( array( 'size' => 'related' ) );
$related .= '
';
$postIDs[] = $post->ID;
$count++;
}
}
}
if ( $count <= 7 ) {
$catIDs = array( );
foreach ( $cats as $cat ) {
if ( 6 == $cat )
continue;
$catIDs[] = $cat;
}
$showposts = 8 - $count;
$args = array(
'category__in' => $catIDs,
'post__not_in' => $postIDs,
'showposts' => $showposts,
'ignore_sticky_posts' => 1,
'orderby' => 'rand',
'tax_query' => array(
array(
'taxonomy' => 'post_format',
'field' => 'slug',
'terms' => array(
'post-format-link',
'post-format-status',
'post-format-aside',
'post-format-quote' ),
'operator' => 'NOT IN'
)
)
);
$cat_query = new WP_Query( $args );
if ( $cat_query->have_posts() ) {
while ( $cat_query->have_posts() ) {
$cat_query->the_post();
// $img = genesis_get_image() ? genesis_get_image( array( 'size' => 'related' ) ) : '';
$img = genesis_get_image( array( 'size' => 'related' ) );
$related .= ' ';
}
}
}
if ( $related ) {
printf( ' ', $related );
}
wp_reset_query();
}
}
//* Подключить и инициализировать скрипт jQuery Masonry
add_action( 'wp_enqueue_scripts', 'sk_masonry_script' );
function sk_masonry_script() {
if ( is_singular( 'post' ) ) {
wp_enqueue_script( 'masonry-init', get_stylesheet_directory_uri().'/js/masonry-init.js', array( 'jquery-masonry' ), '1.0', true );
}
}
Вот типы записей, которые у меня есть:
1: пост (теги, категории)
2: пользовательский_тип_записи: (4 пользовательские таксономии)
3: пользовательский_тип_записи: (2 пользовательские таксономии)
4: пользовательский_тип_записи: (1 пользовательская таксономия)
Я смог внести некоторые изменения, просто посмотрев на код, и мне удалось отобразить связанные записи пользовательских типов. Однако я уверен, что кто-то лучше меня может сделать это работу.
Добро пожаловать, на самом деле, если хотите показывать соответствующие статьи, вы можете использовать плагины
Это поможет вам снизить трудозатраты
Тем не менее, как я вижу, вы хотите отображать связанные статьи о том, как оптимизировать скорость загрузки сайта
Я не советую использовать API-функции вне WordPress, но для меня это хорошее решение.
Я могу предложить вам решение следующим образом:
-
Вы создаете пользовательское поле для записи – _title (содержимое – это заголовок статьи)
-
Вам необходимо создать ИНДЕКС для таблицы wp_postmeta (поле meta_value)
-
ДОБАВИТЬ полный текст для этого поля
Затем используйте SQL-запрос (не API WordPress), чтобы запросить связанные статьи по заголовку статьи
Использование полнотекстового поиска с meta_value имеет относительно хорошую скорость.
Желаю вам успеха
Ответ или решение
Конечно, я помогу вам модифицировать ваш код для отображения связанных записей по пользовательским типам записей и таксономиям. Мы добавим возможность использования пользовательских таксономий в запросах, чтобы получить связанные записи для ваших пользовательских типов записи. Вот обновленный код:
//* Определяем пользовательский размер изображения для миниатюры в связанных записях
add_image_size( 'related', 300, 0, true );
add_action( 'genesis_after_entry_content', 'child_related_posts' );
/**
* Выводит связанные записи с миниатюрой
*/
function child_related_posts() {
if ( is_singular() ) {
global $post;
$count = 0;
$postIDs = array($post->ID);
$related = '';
$tags = wp_get_post_tags($post->ID);
$cats = wp_get_post_categories($post->ID);
// Получаем пользовательские таксономии
$custom_taxonomies = get_object_taxonomies(get_post_type($post), 'objects');
// Запрос по тегам
if ($tags) {
$tagID = array();
foreach ($tags as $tag) {
$tagID[] = $tag->term_id;
}
$args = array(
'tag__in' => $tagID,
'post__not_in' => $postIDs,
'posts_per_page' => 8,
'ignore_sticky_posts' => 1,
'tax_query' => array(
array(
'taxonomy' => 'post_format',
'field' => 'slug',
'terms' => array(
'post-format-link',
'post-format-status',
'post-format-aside',
'post-format-quote'
),
'operator' => 'NOT IN'
)
)
);
$tag_query = new WP_Query($args);
if ($tag_query->have_posts()) {
while ($tag_query->have_posts()) {
$tag_query->the_post();
$img = genesis_get_image(array('size' => 'related'));
$related .= '<div class="related-post"><a href="' . get_permalink() . '" rel="bookmark" title="Permanent Link to ' . get_the_title() . '">' . $img . get_the_title() . '</a></div>';
$postIDs[] = $post->ID;
$count++;
}
}
}
// Запрос по категориям
if ($count <= 7) {
$catIDs = array_filter($cats, function ($cat) {
return $cat !== 6; // Исключаем ID категории 6
});
$showposts = 8 - $count;
$args = array(
'category__in' => $catIDs,
'post__not_in' => $postIDs,
'posts_per_page' => $showposts,
'ignore_sticky_posts' => 1,
'orderby' => 'rand',
'tax_query' => array(
array(
'taxonomy' => 'post_format',
'field' => 'slug',
'terms' => array(
'post-format-link',
'post-format-status',
'post-format-aside',
'post-format-quote'
),
'operator' => 'NOT IN'
)
)
);
$cat_query = new WP_Query($args);
if ($cat_query->have_posts()) {
while ($cat_query->have_posts()) {
$cat_query->the_post();
$img = genesis_get_image(array('size' => 'related'));
$related .= '<div class="related-post"><a href="' . get_permalink() . '" rel="bookmark" title="Permanent Link to ' . get_the_title() . '">' . $img . get_the_title() . '</a></div>';
}
}
}
// Запрос по пользовательским таксономиям
if ($count <= 7) {
foreach ($custom_taxonomies as $taxonomy) {
$terms = wp_get_post_terms($post->ID, $taxonomy->name);
if ($terms) {
$term_ids = wp_list_pluck($terms, 'term_id');
$args = array(
'tax_query' => array(
array(
'taxonomy' => $taxonomy->name,
'field' => 'term_id',
'terms' => $term_ids,
)
),
'post__not_in' => $postIDs,
'posts_per_page' => 8 - $count,
'ignore_sticky_posts' => 1,
'orderby' => 'rand'
);
$custom_query = new WP_Query($args);
if ($custom_query->have_posts()) {
while ($custom_query->have_posts()) {
$custom_query->the_post();
$img = genesis_get_image(array('size' => 'related'));
$related .= '<div class="related-post"><a href="' . get_permalink() . '" rel="bookmark" title="Permanent Link to ' . get_the_title() . '">' . $img . get_the_title() . '</a></div>';
$postIDs[] = $post->ID;
$count++;
}
}
}
}
}
if ($related) {
printf('<div class="related"><h3 class="related-title">Связанные записи</h3><div class="related-posts-list" data-columns>%s</div></div>', $related);
}
wp_reset_postdata();
}
}
//* Подключаем и инициализируем скрипт jQuery Masonry
add_action('wp_enqueue_scripts', 'sk_masonry_script');
function sk_masonry_script() {
if (is_singular('post')) {
wp_enqueue_script('masonry-init', get_stylesheet_directory_uri() . '/js/masonry-init.js', array('jquery-masonry'), '1.0', true);
}
}
Объяснение изменений:
-
Получение пользовательских таксономий: Мы используем
get_object_taxonomies()
для получения всех пользовательских таксономий, связанных с типом записи. Это позволяет вам динамически обрабатывать разные пользовательские типы записей и их таксономии. -
Запрос по пользовательским таксономиям: Мы добавили дополнительный блок кода, который выполняет запрос на основе связанных пользовательских таксономий, извлекая идентификаторы терминов и включив их в
tax_query
. -
Упрощённый вывод: Используем правильные функции WordPress для получения постов и вывода их страниц, что делает код более читаемым и понятным.
Это решение должно помочь вам вывести связанные записи для пользовательских типов записей и таксономий. Не забудьте протестировать код на вашем сайте, чтобы убедиться, что все работает корректно. Если у вас есть дополнительные вопросы или проблемы, пожалуйста, дайте знать!