Как установить название продукта (заголовок поста) из мета-заголовка изображения продукта EXIF

Я стараюсь добавлять свои продукты с минимальным участием человека. Поэтому я ищу решение, чтобы захватить тег заголовка, который есть в моем добавленном изображении продукта, и поместить его в поле Product name при сохранении продукта или перед его сохранением. Любые попытки добиться этого терпят неудачу, потому что WordPress «думает», что заголовок не задан (поэтому не может быть сгенерирован слаг). По крайней мере, я так думаю.

Смотрите скриншот поля

Как установить название продукта (заголовок поста) из мета-заголовка изображения продукта EXIF

Я попытался использовать фрагмент кода, который я нашел здесь, на SO, и переработать его в рабочее решение, но я не понял его.

Вот код, который я придумал:

function fcsp_set_title_on_save( $post_id ) {

$post_thumbnail_id = get_post_thumbnail_id( $post_id );
$filemeta = wp_get_attachment_metadata( $post_thumbnail_id, FALSE );

// Set this variable to false initially.
static $updated = false;

// If title has already been set once, bail.
if ( $updated ) {
    return;
}

// Since we're updating this post's title, set this
// variable to true to ensure it doesn't happen again.
$updated = true;
$title          = $filemeta['image_meta']['title'];

// Update the post's title.
wp_update_post( [
    'ID'         => $post_id,
    'post_title' => $title,
] );
}
add_action( 'save_post', 'fcsp_set_title_on_save' );

Есть идеи, как этого добиться?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
55
1

Ответы 1

Пожалуйста, поместите этот код в function.php, если вы используете woocommerce (я думаю, а не пользовательский тип сообщения)

if (class_exists('WC_Admin_Meta_Boxes')) {
class wcsave extends WC_Admin_Meta_Boxes {
public function __construct() {
    add_action( 'save_post', array( $this, 'save_meta_boxes' ), 1, 2 );
    add_action( 'woocommerce_process_product_meta', 'WC_Meta_Box_Product_Data::save', 10, 2 );
}
public function save_meta_boxes( $post_id, $post ) {
    //$_POST enter your post data here, this will help to control the post request from product woocommerce
    //if product is updating don't execute image title code section
    if (!empty($post->post_title)) {
        return;
    }
    //if new product is being added.
    if (!empty($_POST['post_ID']) && $post_id == $_POST['post_ID']) {
        $post_thumbnail_id = get_post_thumbnail_id( $post_id );
        $attachment_data = get_post( $post_thumbnail_id,OBJECT ); 
        $title = count($attachment_data) > 0 ? $attachment_data->post_title : "PRODUCT-".$post_id;
        remove_action( 'save_post', array( $this, 'save_meta_boxes' ) , 1, 2 );
        wp_update_post( [
            'ID'         => $post_id,
            'post_title' => $title,
            'post_status' => $post->post_status
        ] );
        // re-hook this function
        add_action( 'save_post', array( $this, 'save_meta_boxes' ) , 1, 2 );
    }
}
}
new wcsave();
}

Но обратите внимание, поскольку я тестировал, вам нужна по крайней мере некоторая другая информация вместе с изображением продукта, которое вы загружаете, например, описание продукта, остальное оно сохранит имя изображения как название продукта.

Спасибо

Спасибо за ваш ответ. Проходит из $post_thumbnail_id = get_post_thumbnail_id( $post_id );. Я обновил свою функцию, чтобы включить объявление переменной, но безрезультатно. Название продукта не задано. Любые идеи?

A3O 25.10.2018 11:36

Можете ли вы использовать это так, внутри функции над wp_update_post( [ 'ID' => $post_id, 'post_title' => $title, ] ); добавьте remove_action( 'save_post', 'fcsp_set_title_on_save' );, а затем после wp_update_pos снова добавьте add_action('save_post','fcsp_set_title_on_save')

Rajender Verma 25.10.2018 11:40

Пробовал, при добавлении add_action( 'save_post', 'fcsp_set_title_on_save' ); после оператора wp_update_post выдает ошибку синтаксического анализа. (Неожиданный }) Когда я снова извлекаю add_action, он остается таким же, как и раньше, без указания названия продукта.

A3O 25.10.2018 12:20

Я обновил код выше, если вы используете woocommerce, это может вам помочь. Спасибо :)

Rajender Verma 25.10.2018 13:19

Спасибо, но поскольку я новичок, что мне поставить вместо echo $post_id;die;? Используя его без изменений, он показывает мне номер. Номер PostID? Не могли бы вы помочь мне?

A3O 25.10.2018 15:45

Я обновил свой код выше, пожалуйста, используйте его, он сохранит ваш новый продукт и возьмет название из изображения продукта, которое вы добавите, но вам нужно будет добавить хотя бы одну другую информацию о продукте, например, описание вместе с изображением, поэтому woocommerce проверьте данные nonce при его публикации, просто изображение ничего не сделает. Спасибо :)

Rajender Verma 25.10.2018 20:11

спасибо, что отлично работает. Есть ли способ избежать предоставления другой информации? Цена, виртуальные, загружаемые и скачиваемые файлы устанавливаются другой функцией, можем ли мы это использовать? В конце концов, я хочу предоставить интерфейс только с одной кнопкой: «выбрать и загрузить изображение», а все остальное сделает система. Затем я изменил код, чтобы создать слаг из заголовка с sanitize_title(), но Yoast создает 301 редирект при публикации продукта. Есть ли способ избежать и этого?

A3O 26.10.2018 06:22

Кстати, возвращаясь к моему первоначальному вопросу, можно ли это сделать с помощью JavaScript? Я совершенно не знаком с JS, но как знать ....

A3O 26.10.2018 10:55

Другие вопросы по теме