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

  • Здравствуйте. Подскажите, пожалуйста, как можно настроить отображение автоматически установленной (через свой код) миниатюры а админке на странице редактирования поста в блоке Изображение записи?
    На данный момент там отображаются только установленные вручную.

    Аналогов кода, который использую, в сети много, все разные, но суть одна: проверяет, есть ли миниатюра, если нет — берется первая картинка из записи, если пост без картинок — ставится заглушка по умолчанию. Все работает прекрасно, но есть проблема: а самой админке никоим образом не видно, что миниатюра записи благополучно установлена, как следствие, также отсутствует иконка у записи в общем списке, что создает некоторые неудобства.
    Пример кода:

    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 = "/wp-content/themes/mytheme/img/default.jpg";
      }
      return $first_img;
    }

    или такой:

    function get_fbimage() {
      if ((function_exists('has_post_thumbnail')) && (has_post_thumbnail())) {
      $src = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), '', '' );
      $fbimage = $src[0];
      } else {
        global $post, $posts;
        $fbimage = '';
        $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i',
        $post->post_content, $matches);
        $fbimage = $matches [1] [0];
      }
      if(empty($fbimage)) {
    	
        $fbimage = "/wp-content/themes/mytheme/img/default.jpg";
      }
      return $fbimage;
    }

    Еще момент. Есть также код, с которым в админке нет этой проблемы, но с этим кодом не ставится дефолтная заглушка. Может быть, подскажете, как его видоизменить, чтобы не использовать те, что привёл в примерах выше? Сам код:

    function autoset_featured() {  
        global $post;  
        $already_has_thumb = has_post_thumbnail($post->ID);
        if (!$already_has_thumb) {
        $attached_image = get_children( "post_parent=$post->ID&post_type=attachment&post_mime_type=image&numberposts=1" );
        if ($attached_image) {
        foreach ($attached_image as $attachment_id => $attachment) {
        set_post_thumbnail($post->ID, $attachment_id);
    }}}}
    add_action('future_to_publish', 'autoset_featured');
    add_action('the_post', 'autoset_featured');
    add_action('save_post', 'autoset_featured');
    add_action('draft_to_publish', 'autoset_featured');
    add_action('new_to_publish', 'autoset_featured');
    add_action('pending_to_publish', 'autoset_featured');

    P.S. Модераторам — чтобы не апать старую тему — её можно закрыть, все коды нашёл.

Просмотр 15 ответов — с 1 по 15 (всего 20)
  • а можете объяснить, зачем?

    ведь куда проще при выводе записи сделать проверку has_post_thumbnail и вывести первую картинку записи или заглушку, если картинки не найдено, чем городить огород с заменой миниатюры в админке.

    более того, как вы собрались узнавать — установлена миниатюра или это ваш код подцепил первую картинку записи? вы ведь хотите это в метабокс «изображение записи» запихнуть, так ведь?

    таким образом и логика has_post_thumbnail будет нарушена — вроде как вы кустарно установили миниатюру, а движок об этом не знает ни фига.

    Автор DS

    (@dosolnce)

    ведь куда проще при выводе записи сделать проверку has_post_thumbnail и вывести первую картинку записи или заглушку, если картинки не найдено,

    Мне это и надо было, такого рода коды — единственный вариант, который нашел для решения этой задачи. Подскажите, пожалуйста, как надо было делать это «проще»?

    так вроде уже объяснил.

    
    if ( !has_post_thumbnail() ) {
         //функция нахождения первой картинки записи
    } else {
         the_post_thumbnail();
    }
    

    в самой функции поиска первой картинки сделайте проверку — если на найдена, то пусть возвращает заглушку.

    а админку и метабокс лучше не трогать.

    Автор DS

    (@dosolnce)

    Итог тот же — в админке пусто, хотя на сайте и выводится заглушка, если чуть переписать код (в том виде, что выше, ломает шаблон).

    в админке и должно быть пусто.
    зачем вам картинка в админке то?
    как авторы будут узнавать установлено ли изображение записи или нет, если вы туда запихните программно первую картинку записи\заглушку?

    а то, что у вас там ломается — ну криво написали, бывает.

    Автор DS

    (@dosolnce)

    в админке и должно быть пусто

    Вот как. Что ж, спасибо, буду знать.

    как авторы будут узнавать установлено ли изображение записи или нет

    Вот именно. В списке записей мне достаточно посмотреть, у какого поста нет миниатюры или заглушки, чтобы исправить положение. Ну либо в момент добавления/редактирования. А так — только проверять на самом сайте есть там или нет.
    А ломается потому что в теме изначально код с if ( has_post_thumbnail() ) включает в себя много чего, и без знания php переписать его с else и т.д. довольно сложно.

    ну, во-первых, можете запретить публикацию записей без установленной миниатюры:
    http://www.wphook.ru/media/require-featured-image.html

    во-вторых, в списке записей можно вывести отдельную колонку с миниатюрами:
    http://www.wphook.ru/media/add-column-thumbs.html

    таким образом — вы увидите, где установлена миниатюра, а где нет.
    зачем вообще вам нужны функции первой картинки записи и заглушки мне вообще непонятно.

    Автор DS

    (@dosolnce)

    Спасибо, возможно, воспользуюсь первым хуком.
    Отдельная колонка уже стоит — в ней заглушки не отображаются, писал выше.

    зачем вообще вам нужны функции первой картинки записи и заглушки мне вообще непонятно.

    Ничего страшного, главное, мне понятно.

    Отдельная колонка уже стоит — в ней заглушки не отображаются, писал выше.

    так зачем вам там заглушка то??
    нет картинки — значит миниатюра не установлена.
    или вы страдаете перфекционизмом — мол колонка с миниатюрами должна быть полностью заполнена?

    ну так добавьте в код:

    
    //колонка "миниатюры" в списке записей и страниц start
    function wph_columns_names($defaults){
        $defaults['wph_thumbs'] = 'Миниатюры';
        return $defaults;
    }
    function wph_add_thumbs($column_name, $id){
        if($column_name === 'wph_thumbs'){
            echo the_post_thumbnail(array(125,80));
            if ( !has_post_thumbnail() ) {
                echo '<img src="ссылка на картинку заглушку" />';
            }
        }
    }
    add_filter('manage_posts_columns', 'wph_columns_names', 5);
    add_action('manage_posts_custom_column', 'wph_add_thumbs', 5, 2);
    add_filter('manage_pages_columns', 'wph_columns_names', 5);
    add_action('manage_pages_custom_column', 'wph_add_thumbs', 5, 2);
    //колонка "миниатюры" в списке записей и страниц end
    
    Автор DS

    (@dosolnce)

    Перфекционизм это страшно, в данном случае мотивы были иные. Был уверен, что не так делаю что-то, раз все отображается только на сайте. Но раз это норма, то.. да и чем дальше, тем больше пониманию, что не стоит овчинка выделки, есть плагин для вывода контента, который также не работает с заглушкой, проще установить миниатюру руками, чем ставить костыли для всего, с чем работаешь сейчас или что понадобится впоследствии. А вот автоминиатюра с картинки поста, наоборот, спасает от ненужных действий и экономит время.
    За код в любом случае большое спасибо. И спасибо за помощь.

    Но раз это норма

    Это не норма. Вы что-то придумали (ни смысла и профита я, напр, не уловил) и сделали не правильно.
    Если бы было правильно (через set_post_thumbnail ) — всё бы показывалось.

    да и чем дальше, тем больше пониманию, что не стоит овчинка выделки, есть плагин для

    ..всего практически. 🙂
    А вот это правильно 🙂 Все стандартные задачи уже придуманы и реализованы до нас. Стоит их использовать, а сосредоточиться на более полезных вещах.

    Автор DS

    (@dosolnce)

    Это не норма.

    Выше мне ответили — в админке и не должно отображаться. Так должно или нет? Кто прав из вас двоих?

    Вы что-то придумали

    Моих навыков не хватит на придумывания в этой области, взял готовые из сети. Третий по счету код в моих примерах как раз через set_post_thumbnail, и я писал — с ним нет проблем, берет, если надо, первое изображение — и все есть в админке. Почему стал пробовать остальные — не хватало вывода заглушки. Сейчас отказался от них, настроил заглушку прямо в теле темы, как подсказал @flector (еще раз спасибо ему). Заглушка по-любому не отображается в админке, ну как бы и ладно, выяснили уже. Но Вы пишете «всё бы показывалось» — и я уточняю: Вы уверены? Или это «всё» не относится к заглушке? Если да, то вопрос исчерпан, если нет — подскажите свой вариант.

    в админке и не должно отображаться. Так должно или нет? Кто прав из вас двоих?

    Изображение записи — конечно должно если оно установлено.

    взял готовые из сети

    Не все йогурты коды одинаково полезны 🙂

    Или это «всё» не относится к заглушке? Если да, то вопрос исчерпан, если нет — подскажите свой вариант.

    Если под «заглушкой» Вы имеете виду «дефолтная картинка в качестве изображения записи», тогда да, она не обязательно будет в этом метабоксе.
    Для её установки и управления есть плагины.

    если сможем понять, что вы вообще имеете ввиду — тогда решим, кто прав 🙂

    заглушку можно отображать, но смысл мне непонятен — зачем?
    есть такой хук admin_post_thumbnail_html, можно вешать проверку на него — есть миниатюра — выводим ее, нет миниатюры — выводим заглушку.

    но опять же — какой смысл в заглушке в админке?

    Автор DS

    (@dosolnce)

    Значит, все же норма — wp не считает заглушку за установленное изображение.

    @flector, да, уже вижу.

    • Ответ изменён 6 лет, 8 месяцев назад пользователем DS.
Просмотр 15 ответов — с 1 по 15 (всего 20)
  • Тема «Отображение миниатюр в админке» закрыта для новых ответов.