Связанные записи без плагина для пользовательских типов записей

Вопрос или проблема

Мне нужна помощь в модификации этого скрипта. Я пытаюсь также отображать связанные публикации по пользовательским таксономиям и пользовательским типам записей.

//* Определите пользовательский размер изображения для миниатюры в связанных записях
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' ) ) : '' . get_the_title() . '';
                    $img = genesis_get_image( array( 'size' => 'related' ) );

                    $related .= '
' . $img . get_the_title() . '
'; $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' ) ) : '' . get_the_title() . ''; $img = genesis_get_image( array( 'size' => 'related' ) ); $related .= '
' . $img . get_the_title() . '
'; } } } 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);
    }
}

Объяснение изменений:

  1. Получение пользовательских таксономий: Мы используем get_object_taxonomies() для получения всех пользовательских таксономий, связанных с типом записи. Это позволяет вам динамически обрабатывать разные пользовательские типы записей и их таксономии.

  2. Запрос по пользовательским таксономиям: Мы добавили дополнительный блок кода, который выполняет запрос на основе связанных пользовательских таксономий, извлекая идентификаторы терминов и включив их в tax_query.

  3. Упрощённый вывод: Используем правильные функции WordPress для получения постов и вывода их страниц, что делает код более читаемым и понятным.

Это решение должно помочь вам вывести связанные записи для пользовательских типов записей и таксономий. Не забудьте протестировать код на вашем сайте, чтобы убедиться, что все работает корректно. Если у вас есть дополнительные вопросы или проблемы, пожалуйста, дайте знать!

Оцените материал
Добавить комментарий

Капча загружается...