Совсем недавно для одного из сайтов понадобилось реализовать одну полезную функцию — требовалось автоматизировать добавление изображений записей (featured image) с привязкой по имени файла изображения и значения одного из полей записи. Подобных решений я не видел, потому написал небольшой плагин WordPress для добавления изображения записи по мета-полю и хочу им поделиться, может кому-то пригодятся мои наработки.

Плагин WordPress для добавления изображения записи

В данной версии плагин крайне прост и может послужить или основой для разработки другого плагина, или примером написания плагина для WordPress.

Что делает плагин?

Суть плагина в том, что по нажатию на кнопку на странице в панели администрирования, плагин проверяет все посты определенного типа на наличие изображения записи, если его нет, то ищет среди медиафайлов изображение с именем, соответствующим значению определенного поля у записи. Если изображение найдено, то устанавливает его изображением для записи.Плагин WordPress для добавления изображения записи по мета-полю cover

 

Полезные и интересные функции

Хотелось бы отметить несколько функций, которые есть в коде, которые могут пригодиться где-либо еще:

  • Получение ID изображения по его URL
  • Собственно проверка и прикрепление изображений
  • Запуск функции по кнопке из панели администрирования

Плагин WordPress для добавления изображения записи по мета-полю cover

Архив с плагином

Рабочая версия плагина, можно устанавливать через панель администрирования 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

Пользуйтесь! Спрашивайте! =)

комментария 3

  1. Петр:

    Подскажите пожалуйста, а как сделать чтобы плагин брал изображение из доп поля img ( вида images/1/1.jpg ) и добавлял его как изображения записи?

    • Никита Батищев:

      Тут возникает вопрос — изображения, путь к которым указан в поле img, загружены средствами WordPress? Если да, то в коде получаем значение поля img — $img_field = get_post_meta(get_the_id(), ‘img’, true) и используем это значение, как новое значение переменной $new_picture_name.
      А вот, если изображения загружены не средствами WordPress, то они не «прописаны» в базе данных, значит сначала их нужно туда прописать.

  2. Петр:

    Спасибо за ответ! Вот второй вариант у меня, просто загруженные изображения в папку img и приписанные к каждой теме по поле img. Вы не знаете как такое можно реализовать?

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

Ваш e-mail не будет опубликован.