Я стараюсь добавлять свои продукты с минимальным участием человека. Поэтому я ищу решение, чтобы захватить тег заголовка, который есть в моем добавленном изображении продукта, и поместить его в поле Product name при сохранении продукта или перед его сохранением. Любые попытки добиться этого терпят неудачу, потому что WordPress «думает», что заголовок не задан (поэтому не может быть сгенерирован слаг). По крайней мере, я так думаю.
Смотрите скриншот поля
Я попытался использовать фрагмент кода, который я нашел здесь, на 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' );
Есть идеи, как этого добиться?






Пожалуйста, поместите этот код в 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();
}
Но обратите внимание, поскольку я тестировал, вам нужна по крайней мере некоторая другая информация вместе с изображением продукта, которое вы загружаете, например, описание продукта, остальное оно сохранит имя изображения как название продукта.
Спасибо
Можете ли вы использовать это так, внутри функции над 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')
Пробовал, при добавлении add_action( 'save_post', 'fcsp_set_title_on_save' ); после оператора wp_update_post выдает ошибку синтаксического анализа. (Неожиданный }) Когда я снова извлекаю add_action, он остается таким же, как и раньше, без указания названия продукта.
Я обновил код выше, если вы используете woocommerce, это может вам помочь. Спасибо :)
Спасибо, но поскольку я новичок, что мне поставить вместо echo $post_id;die;? Используя его без изменений, он показывает мне номер. Номер PostID? Не могли бы вы помочь мне?
Я обновил свой код выше, пожалуйста, используйте его, он сохранит ваш новый продукт и возьмет название из изображения продукта, которое вы добавите, но вам нужно будет добавить хотя бы одну другую информацию о продукте, например, описание вместе с изображением, поэтому woocommerce проверьте данные nonce при его публикации, просто изображение ничего не сделает. Спасибо :)
спасибо, что отлично работает. Есть ли способ избежать предоставления другой информации? Цена, виртуальные, загружаемые и скачиваемые файлы устанавливаются другой функцией, можем ли мы это использовать? В конце концов, я хочу предоставить интерфейс только с одной кнопкой: «выбрать и загрузить изображение», а все остальное сделает система. Затем я изменил код, чтобы создать слаг из заголовка с sanitize_title(), но Yoast создает 301 редирект при публикации продукта. Есть ли способ избежать и этого?
Кстати, возвращаясь к моему первоначальному вопросу, можно ли это сделать с помощью JavaScript? Я совершенно не знаком с JS, но как знать ....
Спасибо за ваш ответ. Проходит из
$post_thumbnail_id = get_post_thumbnail_id( $post_id );. Я обновил свою функцию, чтобы включить объявление переменной, но безрезультатно. Название продукта не задано. Любые идеи?