Здравствуйте. Пытаюсь сделать универсальную форму добавления товара. Т.е чтобы была возможность добавить файл по желанию. Выбрал в админке "цифровой товар", но невозможно создать товар не прикрепив zip. Начал пытаться что-то переписать в wp-recalladd-onusers-marketpublic-product.php, но все равно ничего не выходит. Ставил размер файла по умолчанию 0.1Мб, например, либо редактировал проверку на окончание zip. Но в итоге либо просто кнопка публикации не срабатывала, либо вордпресс ругался на "No file was uploaded.", либо публикация будто проходила, но в итоге в базу по сути товар не был добавлен. Я так понимаю у цифровых товаров type_products = 0, а у обычных 1. Может как-то от этого плясать? Подскажите чем-нибудь в этом коде
<?php
//Проверяем соотвествие файла перепубликацией товара или перед его редактированием
add_action('init_update_post_rcl','check_salefile_update_post');
function check_salefile_update_post($post){
if($post->post_type=='products'){
global $sale_file;
global $ufm_options;
if($_FILES['archive_file']){
$size = (isset($ufm_options['max_salefile_size'])&&$ufm_options['max_salefile_size'])?$ufm_options['max_salefile_size']:7;
if ($_FILES["archive_file"]["size"] > $size*1024*1024){
wp_redirect( get_permalink($_POST['formpage']).'?error=size' ); exit;
}
$sale_file = wp_handle_upload( $_FILES['archive_file'], array('test_form' => FALSE) );
if(!$sale_file['file']){
if($sale_file['error']) wp_die($sale_file['error']);
wp_redirect( get_permalink($_POST['formpage']).'?error=file' ); exit;
}
$rest = substr($_FILES['archive_file']['name'], -3);//получаем расширение файла
if($rest!='zip'){
wp_redirect( get_permalink($_POST['formpage']).'?error=type' ); exit;
}
}
}
}
add_filter('pre_update_postdata_rcl','add_publicdata_products_rcl',10,2);
function add_publicdata_products_rcl($postdata,$data){
if(!$_POST['cats']||$data->post_type!='products') return $postdata;
$postdata['post_status'] = 'pending';
return $postdata;
}
add_action('update_post_rcl','update_product_meta_rcl',10,3);
function update_product_meta_rcl($post_id,$postdata,$update){
global $ufm_options;
if($postdata['post_type']!='products') return false;
rcl_update_post_custom_fields($post_id);
$args = array(
'post_parent' => $post_id,
'post_type' => 'attachment',
'numberposts' => -1,
'post_status' => 'any',
'post_mime_type'=> 'image'
);
$temp_gal = get_children($args);
if($temp_gal){
foreach((array)$temp_gal as $key=>$gal){
$attach_list[] = $gal->ID;
}
$attach_list = implode(',',$attach_list);
}
update_post_meta($post_id, 'children_prodimage', $attach_list);
update_post_meta($post_id, 'price-products', $_POST['price-products']);
if(!$update){
if(!$ufm_options['type_product']) update_post_meta($post_id, 'availability_product', 'empty');
update_post_meta($post_id, 'related_products_recall', $_POST['cat'][0]);
}
}
add_filter('public_form_rcl','products_field_publicform',10,2);
function products_field_publicform($fls,$data){
global $ufm_options,$user_ID;
if($data->post_type!='products') return $fls;
if($user_ID)
rcl_enqueue_script( 'ufm-uploader', rcl_addon_url('js/uploader.js', __FILE__),false,true );
$tds = '';
if(!$ufm_options['field_price']){
$tds .= '<tr>'
. '<td>'
. '<label>Стоимость<span class="required">*</span>:</label> '
. '</td><td>'
. '<input type="number" maxlength="10" style="display: inline-block;" name="price-products" required id="price-products" value="'.get_post_meta($data->post_id,'price-products',1).'" style="width: 20%;"> '.rcl_get_primary_currency(1)
. '</td>'
. '</tr>';
}
if(!$ufm_options['type_products']){
$size = (isset($ufm_options['max_salefile_size'])&&$ufm_options['max_salefile_size'])?$ufm_options['max_salefile_size']:7;
if($data->post_id) $tds .= '<tr>
<td>
<label>Замена файла <small>(не более '.$size.' Мб, zip)</small>: </label>
</td>
<td>
<div id="sale-file-upload" class="recall-button rcl-upload-button">
<span>'.__('Заменить файл','wp-recall').'</span>
<span class="progress-bar"></span>
<input id="replace-sale-file" name="uploadfile" type="file" accept=".zip">
</div>'
. '</td>'
. '</tr>';
else $tds .= '<tr>
<td>
<label>Продаваемый файл (zip/не более '.$size.'МВ):</label>
</td>
<td>
<input accept=".zip" type="file" id="product_file" name="archive_file" class="field"/>'
.'</td>'
. '</tr>';
}
if($tds) $fls .= '<table>'.$tds.'</table>';
return $fls;
}
add_filter('after_public_form_rcl','add_script_filesize_ufm',10,2);
function add_script_filesize_ufm($content,$post){
global $ufm_options;
if($post->post_type!='products') return $content;
if($ufm_options['type_products']==0) return $content;
$size = (isset($ufm_options['max_salefile_size']))?$ufm_options['max_salefile_size']:7;
$content .= '';
return $content;
}
add_action('update_post_rcl','update_product_meta',10,3);
function update_product_meta($post_id,$postdata,$update){
global $user_ID,$sale_file;
if($postdata['post_type']!='products'||$update) return false;
if($sale_file['file']){
$attachment = array(
'post_mime_type' => $sale_file['type'],
'post_title' => 'salefile',
'post_content' => intval($_POST['sale_price']).'/3/86400' ,
'guid' => $sale_file['url'],
'post_parent' => $post_id,
'post_author' => $user_ID,
'post_status' => 'inherit'
);
$attach_id = wp_insert_attachment( $attachment, $sale_file['file'], $post_id );
$attach_data = wp_generate_attachment_metadata( $attach_id, $sale_file['file'] );
wp_update_attachment_metadata( $attach_id, $attach_data );
do_action('upload_sale_file',$attach_id,$sale_file);
}
}
Выход из проблемы нашли, но не до конца. В настройках выставили тип товаров - физические товары и услуги и добавили еще одно поле в форму добавления товара с типом "файл". Теперь в публикации товара есть "Выгрузить загруженный файл". Допустим это можно как-то скрыть какими-либо средствами, ок. Теперь нужно, чтобы ссылка на этот файл приходила покупателю по емейл. Нашел файл /wp-recall/add-on/magazin/templates/order.php. Добавляю global $user_ID и пытаюсь вывести ссылку на закаченный файл в публикации, но че-т не выходит( Так как в PHP я толком не умею, то ничего не выходит. Что с этим сделать?
$value = '<a href="'.$this->get_filter_url($field['slug'],$value).'" target="_blank">'.$value.'</a>';