Совсем недавно для одного из сайтов понадобилось реализовать одну полезную функцию — требовалось автоматизировать добавление изображений записей (featured image) с привязкой по имени файла изображения и значения одного из полей записи. Подобных решений я не видел, потому написал небольшой плагин WordPress для добавления изображения записи по мета-полю и хочу им поделиться, может кому-то пригодятся мои наработки.
Плагин WordPress для добавления изображения записи
В данной версии плагин крайне прост и может послужить или основой для разработки другого плагина, или примером написания плагина для WordPress.
Что делает плагин?
Суть плагина в том, что по нажатию на кнопку на странице в панели администрирования, плагин проверяет все посты определенного типа на наличие изображения записи, если его нет, то ищет среди медиафайлов изображение с именем, соответствующим значению определенного поля у записи. Если изображение найдено, то устанавливает его изображением для записи.
Полезные и интересные функции
Хотелось бы отметить несколько функций, которые есть в коде, которые могут пригодиться где-либо еще:
- Получение ID изображения по его URL
- Собственно проверка и прикрепление изображений
- Запуск функции по кнопке из панели администрирования
Архив с плагином
Рабочая версия плагина, можно устанавливать через панель администрирования WordPress.
Качаем тут — nb-attach-featured-image
Код главного файла плагина
Код главного файла плагина, который распознается WordPress. Прописана регистрация пункта меню и отсылка к файлу, который отвечает за содержимое страницы плагина панели администрирования.
Все комментарии написаны на английском, программисты должны знать английский =), да и мало ли кому пригодится!
<?php /** * @package NB attach images * @version 1.0 */ /* Plugin Name: Update featured images Plugin URI: https://inmysight.ru Description: Update featured images with the image from library with the name like a data from one of meta-fields. Author: Nickita Batischev Version: 1.0 Author URI: https://inmysight.ru Text Domain: nb-attach-images */ function nb_reattach_page(){ global $wpdb; include 'nb-attach-admin.php'; /* admin menu page comes from here */ } function nb_reattach_menu() { /* creating menu item arguments */ $page_title = 'Update featured images'; /* Title of admin page*/ $menu_title = 'Update featured images'; /* Text in admin menu */ $capability = 'edit_pages'; /* acces rights - read WordPress manual for details */ $menu_slug = 'nb-reattach'; /* slug for url */ $function = 'nb_reattach_page'; /* function that runs on menu item click */ $icon_url = 'dashicons-universal-access-alt'; /* icon for menu item */ $position = 4; /* position in menu */ add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position ); } add_action('admin_menu', 'nb_reattach_menu'); /* registering menu item */ ?>
Код страницы плагина в панели администрирования WordPress
Здесь представлен код страницы панели администрирования, но не только =) . Здесь же находится основная функция плагина. По сути, ее бы стоило вынести отдельно =) .
<div class="wrap"> <h2>Update featured images</h2> <p>Push "Update featured images" to update images =)</p> <hr /> <a style="width: 200px; color: #fff; text-align: center; background-color:#336699; padding:8px 8px 8px 8px; display: block; border: 1px solid #ccc; border-radius: 5px;" href="?page=<?php echo $_GET['page']; ?>&nbreattach=run"> Update Featured Images </a> <hr /> <?php /* getting image id from image url */ function nb_get_image_id($image_url) { global $wpdb; $attachment = $wpdb->get_col($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE guid='%s';", $image_url )); return $attachment[0]; } function nb_reattach_pictures(){ $upd_count = 0; $posts_count = 0; /* getting all needed posts */ $the_query = new WP_Query(array( 'post_type' => 'post', 'nopaging' => 'true' )); /* getting posts of certain type, all posts without paging */ /* working with posts */ if ( $the_query -> have_posts() ) { echo '<ul>'; while ( $the_query -> have_posts() ) { $the_query -> the_post(); $upload_dir = wp_upload_dir()['baseurl'].'/'; /* getting uploads path */ $meta_field_data = get_post_meta(get_the_id(), 'meta_field_name', true); /* getting meta field data */ $new_picture_name = $upload_dir.$meta_field_data.'.jpg'; /* making needed image url */ $posts_count++; if ((has_post_thumbnail(get_the_id()) != true) && (nb_get_image_id($new_picture_name) != 0) ) { set_post_thumbnail( get_the_id(), nb_get_image_id($new_picture_name) ); /* attaching image by it's ID to the post */ $upd_count++; } } echo '</ul><ul>'; echo '<li>Total posts found: <strong>'. $posts_count . '</strong></li>'; echo '<li>Total updated posts: <strong>'. $upd_count . '</strong></li>'; echo '</ul>'; wp_reset_postdata(); } else { echo "No posts found!"; } } /* running function from button from setting page */ if (isset($_GET["nbreattach"]) && trim($_GET["nbreattach"]) == 'run' ){ nb_reattach_pictures(); } ?> </div>
PS
Пользуйтесь! Спрашивайте! =)
Подскажите пожалуйста, а как сделать чтобы плагин брал изображение из доп поля img ( вида images/1/1.jpg ) и добавлял его как изображения записи?
Тут возникает вопрос — изображения, путь к которым указан в поле img, загружены средствами WordPress? Если да, то в коде получаем значение поля img — $img_field = get_post_meta(get_the_id(), ‘img’, true) и используем это значение, как новое значение переменной $new_picture_name.
А вот, если изображения загружены не средствами WordPress, то они не «прописаны» в базе данных, значит сначала их нужно туда прописать.
Спасибо за ответ! Вот второй вариант у меня, просто загруженные изображения в папку img и приписанные к каждой теме по поле img. Вы не знаете как такое можно реализовать?
здравствуйте, у меня шаблон generatepress и никакая инструкция вовсе не подходит к шаблону. выскакивает всякие ошибки. А проблема у меня в следующем:
На моем сайте rianovost.ru картинки выводятся, но только те, которые предварительно загружаю в время создания записи это и отнимает время, и неудобно. Дело в том, что я пишу в ворде, оттуда через специальный плагин загружаю на сайт, в том числе картинки, которые я предварительно загрузил в ворд во время написания поста. Это очень удобно, в ворде много функции. И в самой записи все загружается один в дин. то есть промахов или косяков на стороне ворда или плагина исключается . Но на главной странице записи попадают, а вот картинки нет, по этому мне нужно, что выводился первая картинка из записи . Но это еще не все! Есть и другая проблема! Те картинки, которые выводились (Выводятся те картинки, которые предварительно загружаю в библиотеку) у них под картинками в постах присутствует описание , это описание по формату (шрифт,цвет, курсив и размер) но вот на главной странице подпись выводится как обычный текст. И это жутко не красиво! И не только на главной , еще и когда поделюсь в соцсетях, вместе с заголовком «клеится» caption изображения! Подскажите пожалуйста, как делать, что предлагайте?
Сайт rianovost.ru
Доброго дня!
По поводу изображений для постов — если не писать своё, то можете попробовать, для начала, вот такой плагин — https://ru.wordpress.org/plugins/auto-post-thumbnail/
По поводу подписей — сложно сказать конкретно, но предположу, что косяк кроется где-то в шаблоне главной страницы в теме. Здесь уже требуется вмешательство в код.
По поводу «поделиться в соцсетях» — надо проверить верность заполнения мета-полей OpenGraph у страниц — всякие там og:image, og:title и так далее! Простым способом может оказаться установка и настройка SEO-плагинов вроде Yoast.