Поддержка Проблемы и решения Первое изображение записи взамен миниатюр

  • Добрый день народ!
    Известно, что open graph выводит картинку, которую при создании записи назначено в качестве миниатюры, но можно его заставить вывести картинку в том случае, если миниатуры не задано, то есть добавляем функцию для og где будет присутствовать кусок кода

    //ДЛЯ ИЗОБРАЖЕНИЙ
    $first_img = '';
    $otimg = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
    $first_img = $matches [1][0];
    if(empty($first_img)){
    $first_img = get_bloginfo('template_directory'). '/wp-content/uploads/2019/11/rianovost.ru_.jpg';
    }

    И после этого при шаринге в соцсетях open graph выводит картинку, которая задана в качестве миниатюры, а если миниатуры нет, то благодаря коду выше выводит первое изображение записи если даже это изображение находится вне хостинга, то есть выставлен из других сайтов.

    Теперь мой вопрос в следующем :
    Известно, что можно настроить вывод похожих записей без плагина если вставить код в нужное место

    
    <div class="poxojie_zapisi">
    <?php
    $categories = get_the_category($post->ID);
    if ($categories) {
    $category_ids = array();
    foreach($categories as $individual_category) $category_ids[] = $individual_category->term_id;
    $args=array(
    'category__in' => $category_ids,
    'post__not_in' => array($post->ID),
    'showposts'=>5,
    'orderby'=>rand,
    'caller_get_posts'=>1);
    $my_query = new wp_query($args);
    if( $my_query->have_posts() ) {
    echo '<h3>Похожие записи:</h3>';
    echo '<ul>';
    while ($my_query->have_posts()) {
    $my_query->the_post();
    ?>
    
    <li><a>" rel="bookmark" title="<?php the_title(); ?>">
    <?php the_post_thumbnail(); ?><br /><?php the_title(); ?></a></li>
    <?php
    }
    echo '</ul>';
    }
    wp_reset_query();
    }
    ?>
    </div>
    

    Но этот код выводит только те изображения, которые заданы в качестве миниатуры во время создания записи.
    Мой вопрос к программистам :
    Как первый код от open graph интегрировать в коде вывода похожих записей, что как в open graph выводил первое изображение записи если даже миниатуры не заданы.
    То же самое касается вывода первой картинки на главной в анонсах. Тут вообще странное дело получается. Если в записи не вставить тег далее, то на главной выводится анонсы с изображением только из тех записей, где задана миниатуры, а записи без заданных миниатюр выводятся голым текстом, но как только вставлю в записи тег далее, то на главной выводятся первые изображения записи, словно тег далее подталкивает изображения на главной.
    Кто нибудь знает как быть с этим багом?
    Тема GeneratePress
    Тема поддерживает вывод краткого анонса вне зависимости вставлен ли в записи тег далее, например в других темах если не вставить тег далее, то на главной выводит запись целиком, но у меня вывод анонса не зависит от тега. Но зато вывод изображении почему то зависит от тега далее.

    • Тема изменена 3 года, 11 месяцев назад пользователем Yui. Причина: please use CODE button for code formatting

    Страница, с которой нужна помощь: [войдите, чтобы увидеть ссылку]

Просмотр 4 ответов — с 1 по 4 (всего 4)
  • Добавил в functions.php код

    /* ПЕРВУЮ КАРТИНКУ В КАЧЕСТВЕ МИНИАТЮРЫ */
    function get_post_image() {
    ​ ​ ​ ​ global $post, $posts;
    ​ ​ ​ ​ $first_img = '';
    ​ ​ ​ ​ ob_start();
    ​ ​ ​ ​ ob_end_clean();
    ​ ​ ​ ​ $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
    ​ ​ ​ ​ $first_img = $matches [1] [0];
    ​ 
    ​ ​ ​ ​ ​ ​ ​ ​ //Если на странице нет картинок, то ставим картинку по-умолчанию
    ​ ​ ​ ​ if(empty($first_img)){
    ​ ​ ​ ​ $img_dir = get_bloginfo('template_directory');
    ​ ​ ​ ​ $first_img = $img_dir . '/images/post-default.jpg';
    ​ ​ ​ ​ }
    ​ ​ ​ ​ return $first_img;
    }

    Но чтобы функция работала, нужно в «нужное место» вставить следующий код
    <img src="<?php echo get_post_image(); ?>" alt="<?php the_title(); ?>" />

    Вопрос :
    Где в коде вывода похожих записей вставить этот код? Где бы не вставил, либо дублируются некоторые записи, либо ничего не происходит, либо выдаёт ошибку.
    Нужно задать условие :
    Если в записи не установлена миниатура, то вывести первое изображение записи, а если установлена не вывести. А в моем случае получается две изображения, где установлена миниатура. Кроме того вывод картинок по моему методу получаются без ссылок

    Нужно задать условие :
    Если в записи не установлена миниатура, то вывести первое изображение записи, а если установлена не вывести. А в моем случае получается две изображения, где установлена миниатура. Кроме того вывод картинок по моему методу получаются без ссылок

    Товарищи я решил свой вопрос сам, если кому нужна инструкция, я могу поделиться. Суть вопроса такова :
    1. Создать блок похожих записей без плагина
    2. Вывести первое изображение записи если не установлена миниатюра
    3. Но если установлена миниатюра, сделать так, что не выводился первое изображение записи заодно (проблема двух картин)

    Напишу инструктаж, как вывести первое изображение записи, если не задана миниатюра в самой записи. Используя инструкции из разных блогов получил первое изображение там, где не задана миниатюра, зато заодно в тех записях, где задана миниатюра получил две изображении, что и не очень приятно))) по этому пришлось допилить код с чем и поделюсь ))
    Задача:
    1.Вывод первого изображении записи на главной если не задана миниатюра.
    2.Создание блока похожих записей и вывод первого изображении записи на блоке похожих записей если не задана миниатюра.
    3.Исходя из того, что некоторые ранее созданные записи с заданными миниатюрами, то нужно вставить условие, которое при наличии миниатюр запрещает вывод первой картинки,иначе получаем либо дубль, либо две разные картинки на главной (в зависимости того, что вы добавили в свое время)
    Итак, по порядку:
    Шаг1. Вставим следующую функцию в functions.php

    //ВЫВОД ПЕРВОЙ КАРТИНКИ С ПОСТА
    function first_post_image() {
      global $post, $posts;
      $first_img = '';
      ob_start();
      ob_end_clean();
      $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
      $first_img = $matches [1] [0];
      if(empty($first_img)){
       $first_img = "<?php the_post_thumbnail('thumbnail')";
    // для вывода миниатюр в похожие записи 
      }
      return $first_img;
    }

    файл сохраним . Далее вставляем условие пункта 2 в файл single.php в конце вставим команду:

    <div class="related_posts">
    <h3>Похожие записи</h3>
    <?php
    $categories = get_the_category($post->ID);
    if ($categories) {
     $category_ids = array();
     foreach($categories as $individual_category) $category_ids[] = $individual_category->term_id;
     $args=array(
     'category__in' => $category_ids,
     'post__not_in' => array($post->ID),
     'showposts'=>3,
    'orderby'=>rand,
     'caller_get_posts'=>1);
     $my_query = new wp_query($args);
     if( $my_query->have_posts() ) {
     echo '<ul>';
     while ($my_query->have_posts()) {
     $my_query->the_post();
    ?>
    <li><a href="<?php the_permalink() ?>" rel="bookmark" title="<?php the_title(); ?>"><?php if ( has_post_thumbnail() ) { the_post_thumbnail('thumbnail'); }
    else { ?>
    <img src="<?php echo first_post_image() ?>" alt="<?php the_title(); ?>" />
    <?php } ?><div id="box-cel"><br><?php the_title(); ?></div></a></li><?php the_excerpt(); ?>
    <?php
    }
    echo '</ul>';
    }
    wp_reset_query();
    }
    ?></div>

    Естественно, будут выводятся изображения разного размера , по этому в style.css подправим их по своему вкусу.

    Теперь нам нужно , чтобы вывести на главной первое изображение записи если не задана миниатюра, а если задана исключить дубля . Откроем файл content.php и после

    <?php
    		/**
    		 * generate_after_entry_header hook.
    		 *
    		 * @since 0.1
    		 *
    		 * @hooked generate_post_image - 10
    		 */
    		do_action( 'generate_after_entry_header' );
    
    		if ( generate_show_excerpt() ) : ?>
    <?php 

    вставим

    <?php 
    		/*Если надо, чтобы выводилась миниатюра, а если ее нет, первая картинка с записи, то нужно вставлять условие следующего вида:*/
    		if ( has_post_thumbnail() ) {}
    else { ?>
    <img src="<?php echo first_post_image() ?>" alt="<?php the_title(); ?>" />
    <?php } ?>

    Таким образом задача решена.
    Но если вдруг у вас никакое изображение не задано,и вы хотите,что на главной выводилась картинка по умолчанию, то в functions.php добавьте следующий код:

    function get_post_image() {
    global $post, $posts;
    $first_img = '';
    ob_start();
    ob_end_clean();
    $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
    $first_img = $matches [1] [0];
    
    if(empty($first_img)){
    $img_dir = get_bloginfo('template_directory');
    $first_img = $img_dir . '/images/post-default.jpg';
    }
    return $first_img;
    }
    

    Потом Откроем файл content.php и после

    <?php
    		/**
    		 * generate_after_entry_header hook.
    		 *
    		 * @since 0.1
    		 *
    		 * @hooked generate_post_image - 10
    		 */
    		do_action( 'generate_after_entry_header' );
    
    		if ( generate_show_excerpt() ) : ?>
    <?php 

    вставим

    <?php 
    		/*Если надо, чтобы выводилась миниатюра, а если ее нет, первая картинка с записи, то нужно вставлять условие следующего вида:*/
    		if ( has_post_thumbnail() ) {}
    else { ?>
    <img src="<?php echo get_post_image() ?>" alt="<?php the_title(); ?>" />
    <?php } ?>

    если вы заметили, я first_post_image заменил на get_post_image

    Отмечаю вопрос решенным! Теперь осталось гадать, как удалить «прыжок» тега «далее»

Просмотр 4 ответов — с 1 по 4 (всего 4)
  • Тема «Первое изображение записи взамен миниатюр» закрыта для новых ответов.