Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save holymong/6747e622b186dbc78459ce1b26c6bf5e to your computer and use it in GitHub Desktop.
Save holymong/6747e622b186dbc78459ce1b26c6bf5e to your computer and use it in GitHub Desktop.
WooCommerce TC Kimlik ve Vergi No Kurumsal Fatura
* Ödeme ekranına geldiğinde 2 tane checkbox olacak. Biri "TC Kimlik No" opsiyonel diğeri "Kurumsal Fautra" opsiyonel.
* Müşteri bu alanlara 10 haneden az bir T.C. yada Vergi No yazarsa hata verecek.
* Kurumsal Fatura Checkbox'ı işaretlenirse Vergi Dairesi ve Vergi No alanı belirecek.
* TC Kimlik No Checkbox'ı işaretlenirse sadece TC Kimlik No alanı belirecek.
* Soyad şirket ünvanı girişinin doğru çalışabilmesi için gerekli değil opsiyonel olarak ayarlandı.
* Kurumsal Fatura seçildiğinde Ad Soyad ve Şirket Ünvanı billing_first_name alanında birleştirip tek bir Input olarak bıraklılmış
billing_last_name ve billing_company gizlenmiştir. TC Kimlik No seçildiğinde yada hiçbir şey seçilmediğinde Ad ve Soyad
iki farklı input olarak duruyor. billing_first_name,billing_last_name
* Kurumsal Fatura seçildiğinde en alt kısımda "Gönderi adresi" checkbox'ı aktif oluyor. TC Kimlik No seçildiğinde yada hiç seçim
yapılmadığında gizleniyor.
* Checkboxlar aynı anda seçilememesi için ayarlama yapıldı birini seçince diğeri uncheck oluyor.
* Eğer iki Checkboxdan biri işaretlenmediyse billing_tc_kimlik_no alanına default olarak 11111111111 yazılacak.
* Checkboxlardan biri seçildiğinde default yazılan 11111111111 kaldırılıyor.
* Checkboxlar işaretlendiğinde doldurulacak alanların isimleri değişiyor. Ör.(Kurumsal Fatura seçiliyken "Ad Soyad" yerine
"Şirket Ünvanı" yazılıyor ve Input alanı 100% width oluyor.)
* BizimHesap.com WooCommerce entegrasyonu Vergi / TC Kimlik No, Vergi Dairesi ve Şirket Adı veya Ad Soyad bilgilerini otomatik
sisteme çekebiliyor. (billing_vergi_dairesi ve billing_tc_kimlik_no olarak define ettiğimiz için)
* Not: Sayfanın en altındaki sipariş notları kısmı kaldırılmıştır. İhtiyaç duyan aktif edebilir. CSS ile düzenlemek gerekiyor.
*Son olarak harslannet hocama teşekkür ederim paylaştığı kodlar için orjinal kodlar için bu kaynaktan da yararlanabilirsiniz;
https://gist.github.com/harslannet/0b6461e3b916d732689bbe4cc3447269
* Ek olarak aşağıdaki CSS kodunu Custom CSS kısmından eklemenizi tavsiye ederim, hatta gerekli diyebilirim.
//GÜNCELLEME
*Şehir isimlerinin TR34 gibi gözükmesi giderildi.
* Telefon nuamrası input alanı düzenlendi. Sadece rakam yazılabiliyor 10 haneden fazla yazılamıyor 10 haneden az yazılır ise
hata mesajı gösteriliyor. Telefon numarası başına 0 olmadan "5551112233" şekilde alınacak. Entegrasyonlarda sorun yaşanmaması için.
*Soyisim yazmmanın zorunlu olmaması bazı müşterilerin soyisimlerini yazmamasına sebebiyet veriyordu ve kargo konusunda sorun yaşanıyordu
Soyisim tekrar zorunlu hale getirildi. Soyisim zorunlu iken Kurumsal fatura seçeneğildiğinde hata vermesi Checkbox işaretlendiğinde
Soyisim kısmına value olarak "." yazılacak şekilde düzeltildi. Henüz daha iyi bir çözüm bulamadım.
En temiz çözüm Soyad alanını da kaldırıp İsim Soyisim bilgisini tek input ile almak.
*Vergi Dairesi veya TC / Vergi NO alanı dolu olduğunda E-Posta şablonunda adres kısmının üstüne eklenecek şekilde düzenlendi.
Artık maillerde de yazılan bu bilgiler iletiliyor.
*WPML kullanan sitelerde input başlıklarının jQuery ile değişimi sorun yaratabiliyor.
*Sipariş notları için CSS kodu eklendi. İsteyenler aşağıdakı CSS kodunu ekleyerek ve unset'i kaldırarak kullanabilir.
Function Silinecek: unset($fields['order']['order_comments']);
CSS Eklenecek: #order_comments_field{display: inline-block;width: 100%;}
*Henüz hesabım sekmesinde vergi dairesi vergi no gibi alanları editleyebilecek bir kod yazılmadı*
*Henüz admin sipariş sekmesinde vergi dairesi vergi no gibi alanları editleyebilecek bir kod yazılmadı*
//CSS Basi
.fullwidth_custom{width: 100% !important;}
#billing_first_name_field{width: 48%;}
#billing_last_name_field{width: 48%;}
#billing_vergi_dairesi_field{width: 48%;float:right;}
#billing_tc_kimlik_no_field{width: 48%;float:left;}
#billing_city_field{width: 48%;float: left;}
#billing_state_field{width: 48%;float: right;margin-top: -92px;}
#billing_phone_field{width: 48%;float: left;}
#billing_email_field{width: 48%;float: right;margin-top: -92px;}
#checkbox_trigger_field{width: 48%;float: right;}
#checkbox_tckno_field{width: 48%;float: left;}
#billing_country{display: none;}
//CSS Sonu
<?php
<?php
function custom_override_checkout_fields( $fields ) {
unset($fields['billing']['billing_address_2']);
unset($fields['billing']['billing_postcode']);
unset($fields['billing']['billing_country']);
unset($fields['billing']['billing_company']);
unset($fields['order']['order_comments']);
$fields['billing']['billing_country']['default'] = 'TR';
$fields['billing']['billing_address_1']['label'] = 'Adres';
$fields['billing']['billing_address_1']['placeholder'] = 'Mahalle, Sokak, Bina No, Daire vb.';
$fields['billing']['billing_address_1']['priority'] = '90';
$fields['billing']['billing_first_name']['placeholder'] = 'Ad';
$fields['billing']['billing_first_name']['label'] = 'Ad';
$fields['billing']['billing_last_name']['placeholder'] = 'Soyad';
$fields['billing']['billing_last_name']['label'] = 'Soyad';
$fields['billing']['billing_city']['label'] = 'İlçe';
$fields['billing']['billing_city']['placeholder'] = 'İlçe';
$fields['billing']['billing_email']['placeholder'] = 'E-Posta kargo takibi için gerekli';
$fields['billing']['billing_phone']['placeholder'] = 'Başında "0" olmadan Ör. "5551112233"';
$fields['billing']['billing_phone']['custom_attributes'] = array("maxlength" => "10" );
unset($fields['shipping']['shipping_address_2']);
unset($fields['shipping']['shipping_postcode']);
unset($fields['shipping']['shipping_company']);
$fields['shipping']['shipping_address_1']['label'] = 'Adres';
$fields['shipping']['shipping_address_1']['priority'] = '90';
$fields['shipping']['shipping_city']['label'] = 'İlçe';
$fields['shipping']['shipping_city']['placeholder'] = 'İlçe';
$fields['shipping']['shipping_address_1']['placeholder'] = 'Mahalle, Sokak, Bina No, Daire vb.';
$fields['shipping']['shipping_first_name']['placeholder'] = 'Ad';
$fields['shipping']['shipping_first_name']['label'] = 'Ad';
$fields['shipping']['shipping_last_name']['placeholder'] = 'Soyad';
$fields['shipping']['shipping_last_name']['label'] = 'Soyad';
$fields['shipping']['shipping_phone']['placeholder'] = 'Başında "0" olmadan Ör. "5301112233"';
$fields['shipping']['shipping_phone']['maxlength'] = 10;
$fields['shipping']['shipping_email']['placeholder'] = 'Kargo bilgileri E-Posta adresinize gönderilecek';
return $fields;
}
add_filter('woocommerce_checkout_fields','custom_override_checkout_fields');
add_action('wp_footer', 'format_checkout_billing_phone');
function format_checkout_billing_phone() {
if ( is_checkout() && ! is_wc_endpoint_url() ) :
?>
<script type="text/javascript">
jQuery( function($){
$('#billing_phone').on( 'input focusout', function() {
var p = $(this).val();
p = p.replace(/[^0-9]/g, '');
$(this).val(p);
});
});
</script>
<?php
endif;
}
add_action( 'woocommerce_checkout_process', 'holymong_checkout_fields_custom_validation' );
function holymong_checkout_fields_custom_validation() {
if ( isset( $_POST['billing_phone'] ) && ! empty( $_POST['billing_phone'] ) ) {
if ( strlen( $_POST['billing_phone'] ) < 10 ) {
wc_add_notice( 'Lütfen telefon numaranızı başında "0" olmadan ve boşluk bırakmadan 10 haneli olarak giriniz. Ör. "5551112233"', 'error' );
}
}
}
add_filter( 'woocommerce_enable_order_notes_field', '__return_false', 9999 );
//T.C. No, Vergi No ve Vergi Dairesi Alanlarını Oluştur
add_filter('woocommerce_checkout_fields', 'tc_vergi_icin_new_checkout_field');
function tc_vergi_icin_new_checkout_field($fields)
{
$fields['billing']['checkbox_tckno'] = array(
'type' => 'checkbox',
'priority' => 5,
'label' => __('TC Kimlik No', 'woocommerce'),
'class' => array('form-row-left'),
'clear' => true
);
$fields['billing']['checkbox_trigger'] = array(
'type' => 'checkbox',
'priority' => 8,
'label' => __('Kurumsal Fatura', 'woocommerce'),
'class' => array('form-row-right'),
'clear' => true
);
$fields['billing']['billing_tc_kimlik_no'] = array(
'label' => __('Vergi / TC Kimlik No', 'woocommerce'),
'placeholder' => _x('Vergi No', 'placeholder', 'woocommerce'),
'class' => array('form-row form-row-last'),
'required' => true,
'priority' => 31,
'clear' => true
);
$fields['billing']['billing_vergi_dairesi'] = array(
'label' => __('Vergi Dairesi', 'woocommerce'),
'placeholder' => _x('Vergi Dairesi', 'placeholder', 'woocommerce'),
'class' => array('form-row form-row-first'),
'required' => true,
'priority' => 32,
'clear' => true
);
if (!isset($_POST['checkbox_trigger'])) {
$fields['billing']['billing_tc_kimlik_no']['required'] = false;
$fields['billing']['billing_vergi_dairesi']['required'] = false;
} else {
$fields['billing']['billing_tc_kimlik_no']['required'] = true;
$fields['billing']['billing_vergi_dairesi']['required'] = true;
}
if (!isset($_POST['checkbox_trigger'])) {
$fields['billing']['billing_tc_kimlik_no']['default'] = '11111111111';
} else {
$fields['billing']['billing_tc_kimlik_no']['default'] = '11111111111';
}
return $fields;
}
// TC Doğrula Fonksiyonu
function isTcKimlik($tc)
{
if (strlen($tc) < 10) {
return false;
}
if ($tc[0] == '0') {
return false;
}
return true;
}
// TC Kimlik Noyu Doğrula
add_action('woocommerce_checkout_process', 'tc_numara_dogrula');
function tc_numara_dogrula()
{
$tcno = $_POST['billing_tc_kimlik_no'];
if (!empty($tcno)) {
if (!is_numeric($tcno) && !isset($_POST['checkbox_tckno'])) {
wc_add_notice(__('Lütfen Vergi Numaranızı yada TC Kimlik Numaranızı kontrol edin.'), 'error');
} else if (!empty($tcno) && !isset($_POST['checkbox_tckno'])) {
if (!isTcKimlik($tcno))
wc_add_notice(__('Lütfen Vergi Numaranızı yada TC Kimlik Numaranızı kontrol edin.'), 'error');
}
}
}
//E-Mail Şablonlarında vergi no ve vergi dairesi gösterimi için.
add_filter('woocommerce_email_order_meta_keys', 'holymong_vergi_numaralari_email_bildirim');
function holymong_vergi_numaralari_email_bildirim( $keys ) {
$keys['Vergi / TC Kimlik No:'] = '_billing_tc_kimlik_no';
$keys['Vergi Dairesi'] = '_billing_vergi_dairesi';
return $keys;
}
//Adminin Sipariş Detayında Fatura Bilgilerinde TC No ve Vergi Dairesi Görebilmesi İçin
add_action('woocommerce_admin_order_data_after_billing_address', 'vergi_no_dairesi', 10, 1);
function vergi_no_dairesi($order)
{
echo '<p><strong>' . __('Vergi / TC Kimlik No') . ':</strong> ' . $tc_kimlik_no = get_post_meta($order->get_id(), '_billing_tc_kimlik_no', true) . '</p>';
echo '<p><strong>' . __('Vergi Dairesi') . ':</strong> ' . $vergi_dairesi = get_post_meta($order->get_id(), '_billing_vergi_dairesi', true) . '</p>';
}
//Koşullara göre alanları göstermek için gerekli javascript kodları
add_action('woocommerce_after_checkout_form', 'kosullu_alan_goster', 6);
function kosullu_alan_goster()
{
?>
<script type="text/javascript">
jQuery('#payment_method_paytrcheckout').hide()
jQuery('#ship-to-different-address').hide()
jQuery('.woocommerce-billing-fields > h3').html('Adres bilgileri');
jQuery('#billing_tc_kimlik_no').hide();
jQuery('#billing_vergi_dairesi').hide();
jQuery('#billing_tc_kimlik_no_field > label').hide();
jQuery('#billing_vergi_dairesi_field > label').hide();
jQuery("#billing_tc_kimlik_no_field > label").append("<abbr class='required' title='gerekli'>*</abbr>");
jQuery("#billing_vergi_dairesi_field > label").append("<abbr class='required' title='gerekli'>*</abbr>");
jQuery('input#checkbox_trigger').change(function() {
if (this.checked) {
jQuery('.woocommerce-billing-fields > h3').html('Fatura bilgileri');
jQuery("#checkbox_tckno").prop( "checked", false );
jQuery('#billing_tc_kimlik_no').show();
jQuery('#billing_vergi_dairesi').show();
jQuery('#billing_last_name_field').hide();
jQuery('#billing_tc_kimlik_no_field > label').show();
jQuery('#billing_vergi_dairesi_field > label').show();
jQuery('#billing_tc_kimlik_no_field > label > span').remove();
jQuery('#billing_vergi_dairesi_field > label > span').remove();
jQuery('#billing_tc_kimlik_no_field').addClass('validate-required');
jQuery('#billing_vergi_dairesi_field').addClass('validate-required');
jQuery('#billing_first_name_field > label').html('Şirket Ünvanı&nbsp;<abbr class="required" title="gerekli">*</abbr>')
jQuery('#billing_tc_kimlik_no').attr("value", "")
jQuery('#billing_first_name').attr("placeholder", "Şirket Ünvanı")
jQuery('#billing_first_name_field').attr("class", "form-row form-row-first validate-required fullwidth_custom")
jQuery('#billing_last_name').attr("value", ".")
jQuery('#ship-to-different-address').show()
jQuery('#billing_tc_kimlik_no').attr("placeholder", "Vergi No")
jQuery('#billing_tc_kimlik_no_field').attr("class", "form-row form-row form-row-last ")
jQuery('#billing_tc_kimlik_no_field > label').html('Vergi No&nbsp;<abbr class="required" title="gerekli">*</abbr>')
} else {
jQuery('.woocommerce-billing-fields > h3').html('Adres bilgileri');
jQuery('#billing_last_name_field').show();
jQuery('#billing_vergi_dairesi').hide();
jQuery('#billing_vergi_dairesi_field > label').hide();
jQuery('#billing_vergi_dairesi').hide();
jQuery('#billing_tc_kimlik_no').hide();
jQuery('#billing_vergi_dairesi_field > label').hide();
jQuery('#billing_tc_kimlik_no_field > label').hide();
jQuery('#billing_first_name_field > label').html('Ad&nbsp;<abbr class="required" title="gerekli">*</abbr>')
jQuery('#billing_tc_kimlik_no').attr("value", "11111111111")
jQuery('#billing_first_name').attr("placeholder", "Ad")
jQuery('#billing_first_name_field').attr("class", "form-row form-row-first validate-required")
jQuery('#billing_tc_kimlik_no_field > label').html('TC Kimlik No&nbsp;<abbr class="required" title="gerekli">*</abbr>')
jQuery('#ship-to-different-address').hide()
jQuery('#billing_last_name').attr("value", "")
}
});
jQuery('input#checkbox_tckno').change(function() {
if (this.checked) {
jQuery( "#checkbox_trigger" ).prop( "checked", false );
jQuery('#billing_tc_kimlik_no').show();
jQuery('#billing_tc_kimlik_no_field > label').show();
jQuery('#billing_tc_kimlik_no_field > label > span').remove();
jQuery('#billing_tc_kimlik_no_field').addClass('validate-required');
jQuery('#billing_tc_kimlik_no').attr("value", "")
jQuery('#billing_first_name').attr("placeholder", "Ad")
jQuery('#billing_tc_kimlik_no').attr("placeholder", "TC Kimlik No")
jQuery('#billing_tc_kimlik_no_field').attr("class", "form-row form-row form-row-last fullwidth_custom ")
jQuery('#billing_last_name_field').show()
jQuery('#billing_first_name_field > label').html('Ad&nbsp;<abbr class="required" title="gerekli">*</abbr>')
jQuery('#billing_vergi_dairesi').hide();
jQuery('#billing_vergi_dairesi_field > label').hide();
jQuery('#billing_vergi_dairesi').hide();
jQuery('#billing_vergi_dairesi_field > label').hide();
jQuery('#billing_first_name_field').attr("class", "form-row form-row-first validate-required")
jQuery('#billing_tc_kimlik_no_field > label').html('TC Kimlik No&nbsp;<abbr class="required" title="gerekli">*</abbr>')
jQuery('#ship-to-different-address').hide()
jQuery('.woocommerce-billing-fields > h3').html('Adres bilgileri');
} else {
jQuery('#billing_tc_kimlik_no').hide();
jQuery('#billing_tc_kimlik_no_field > label').hide();
jQuery('#billing_tc_kimlik_no').attr("value", "11111111111")
jQuery('#billing_first_name').attr("placeholder", "Ad")
jQuery('#billing_tc_kimlik_no').attr("placeholder", "Vergi No")
jQuery('#billing_tc_kimlik_no_field').attr("class", "form-row form-row form-row-last ")
jQuery('#billing_last_name_field').show()
jQuery('#billing_last_name_field').attr("class", "form-row form-row-last validate-required")
jQuery('#billing_first_name_field > label').html('Ad&nbsp;<abbr class="required" title="gerekli">*</abbr>')
jQuery('#billing_tc_kimlik_no_field > label').html('Vergi No&nbsp;<abbr class="required" title="gerekli">*</abbr>')
}
});
</script>
<?php
}
@tamwoo
Copy link

tamwoo commented Jan 27, 2021

@nuwii
"verilen şehir bilgisinin admin paneli ve faturada plaka bilgisine dönüşmesi" hatasını kodlarda country kısmını unset yaptığınız için alıyorsunuz muhtemelen. ilgili yeri düzenlerseniz sorun çözülecektir.

@holymong
Copy link
Author

@nuwii @tamwoo @gezmenadam @egebese @lord5521 Güncelleme yapıldı sizde test edebilirseniz sevinirim.

@sahanet
Copy link

sahanet commented Jun 12, 2022

Merhaba,
Bu eklenti/kodu nasıl kullanabilirim?

@gmgurgen
Copy link

gmgurgen commented Aug 4, 2022

@holymong Hocam merhaba, öncelikle elinize sağlık.
Ben görünümde bir kaç sorun yaşadım; İlçe / Şehir ve Telefon / E-posta alanlarında ve kurumsal fatura seçildiğinde vergi no / vergi dairesi alanlarında kaymalar meydana geliyordu ve tablet/mobil görünümünde alanlar üstüste biniyordu, margin-top: - değerli olduğu için.
Gördüğüm kadarı ile alanlar form-row-first ve form-row-last classlarına göre yerleşim yapıyor genel CSS'de.
Class ekle değiştir ile uğraşmadan sizin kodlarınızda;

$fields['billing']['billing_tc_kimlik_no'] = array(
        'label'     => __('Vergi / TC Kimlik No', 'woocommerce'),
        'placeholder'   => _x('Vergi No', 'placeholder', 'woocommerce'),
        'class'     => array('form-row form-row-last'),
        'required' => true,
        'priority' => 32,
        'clear'     => true
    );
	
    $fields['billing']['billing_vergi_dairesi'] = array(
        'label'     => __('Vergi Dairesi', 'woocommerce'),
        'placeholder'   => _x('Vergi Dairesi', 'placeholder', 'woocommerce'),
        'class'     => array('form-row form-row-first'),
        'required' => true,
        'priority' => 31,
        'clear'     => true
    );
şeklinde sıralamaları değiştirip, CSS kodlarında da aşağıdaki değişiklikleri yaparak sorunu çözdüm. 
    @media only screen and (min-width: 993px) {
.fullwidth_custom{width: 100% !important;}
#billing_first_name_field{width: 48%;}
#billing_last_name_field{width: 48%;}
#billing_vergi_dairesi_field{width: 48%;float:right;}
#billing_tc_kimlik_no_field{width: 48%;float:left;}
#billing_city_field{width: 48%;float: left;clear: none;}
#billing_state_field{width: 48%;float: right;clear: none;}
#billing_phone_field{width: 48%;float: left;clear: none;}
#billing_email_field{width: 48%;float: right; clear: none;}
#checkbox_trigger_field{width: 48%;float: right;}
#checkbox_tckno_field{width: 48%;float: left;}
}
#order_comments_field{display: inline-block;width: 100%;}
#billing_country{display: none;}
Aynı soruna yaşayan başkaları olduysa yardımcı olması dileğiyle.

@holymong
Copy link
Author

holymong commented Aug 4, 2022

@gmgurgen Teşekkürler paylaşım için. Şu kodu bir ara tekrar derleyip plugin haline getirebilsek güzel olacak.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment