Microsoft Sculpt. Эргономичные клавиатура и мышка год спустя.

207

Прошел год как я активно поработал с клавиатурой. Сделал с ней несколько десятков проектов. Опишу итоговое мнение по прошествие времени.

Минусы, они же просто замечания.

Начну с небольших минусов. Спойлер — плюсы не изменились и их больше.

Маркость.


Конечно за время пребывания под моими руками она впитала в себя пот и жар разработки, которые с разной периодичностью и интенсивностью перепадали на ее корпус. Пластмасса добротная, протер водичкой аккуратно или влажной салфеткой и как новая.

Гравировка не стесалась все четко. Собственно аналогичная большая маркость переходит на подложку, на которой скапливается пот и грязнючесть от рук.
Все это совершенно не критично и касается всех клавиатур, вопрос в том с какой легкостью и вероятностью можно привести к состоянию «как новая».

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

Большеватый размер.

Нет придела совершенству. Хотелось бы немного большей компактности, насколько это возможно. Копус клавиатуры бывает соприкасается с ножкой монитора, когда хочется подвинуть вытянуть руки. Но этот минус — он плюс. Тк из всех текущих вариантов подобного формфактора это самый компактный вариант. Тк разъединен нумпад и в целом дизайн лаконичный. Большую часть занимает подложка, но она, как факт наличия, является важным плюсом.

Мышка умер кликер
Возможно это просто мой опыт. И если бы был сервисный центр от Майкрософт, я бы смог решить эту проблему недорого или даже бесплатно.
Но это только левый кликер. Именно сам тригер в коробочке. Разобрал, понял, что только менять. Разбирается легко. Печально.
Но что радует отдельно мышка стоит, как половина комплекта в целом. Так что покупая сразу все, вы экономите 30-40% и получаете отличную мышку.
Почему отличную? Во первых она не стоит 9к как Логитек. Не тестил, возможно классная, точне опредленно добротная как и остальная продукция данной компании(не реклама, думаю факт для многих). Но я попробовал два варианта из недорого сегмента того, что можно заказать в типичном инет магазине. Не буду рекламировать синий воздушый магаз.
Обошлись мне в 1200 и 1600 рублей. И вот это — фейл. У первой начал скрипеть невозможно колесик на 2ой день. Да и сборка конечно была слишком дешевой. Вторая получше, как по форме так и по сборке. Только батарейки жрала как не в себя на подсветке, хватало на 1,5-2 недели. Но тоже отвалилось колесико ;)). Только уже 1,5 месяца спустя. Я плюнул и понял для себя, что ровно за эти же деньги я получаю лучшего качества и эргономике Sculpt мышку микромягких. Заказал новую.
А так же этот опыт вдохнул жизнь в мой трекпад, который долго пылился. Использую для скрола длинных портянок кода, стоит слева, мышка справа. Быстро чувствительно, колесико мышки бережет. И полезно хоть на ненадолго переключить руку. Еще лучше чередовать левую и правую. Так делал на симметричной мышке. Для эргономичных такое не прокатит, форма не позволяет.

Крошки.
Расстояние между кнопками позволяет попаданию всяких инородных тел внутрь. Удвляешься, как столько и чего там скопилось. Но опять же типично для любой клавы. Постучал вертикально и почти все выпало. Лучше разобрать, но я не стал боюсь ) И так все выпало.

Плюсы


Кисти запястье.
По мышке вопросов никаких. Привык и уже долго использовать обычные мыхи.

Подложка и подставка.

Подложка важная часть клаивиатуры, хоть и громоздкая. А так же открыл для себя месяц спустя — это подъем под подложку.

Дает нужный уклон, что еще больше расслабляет положение рук. Уклон идет противоположно плоскому варианту.


Плечи разводятся.
Кроме кистей конечно хорошо плечам. Не идеально да и комплекция у всех разная. В будущем очень хочу попробовать раздельные клавы, чтобы разводить руки максимально широко.

Но достать не просто и не дешево, не смотря на простоту сборки. Еще не мейнстрим, как хотелось бы. А там и вендоры.

Мышка кайф.
Уже описал выше про нее. Увесистая удобная, уже не могу обычный для работы. Если только в игоры не долго. Но опять же для стратегий приятно переключать микрософт.

Батарейки долго держат.
Я беру из фикспрайса по 100 рублей. Немного не экологично с моей стороны. Но дюрасела хватит на полгода или больше. Ждем модель с АКБ.


Эргономика работает и это не просто маркетинг.
Рад что стоимость окупила плюсы. Могу сказать что от мышки эффект чувствуется сразу. Особенно у кого болит кисть. Проблему пройдут на 1-2ой день. Максимум неделю. Если конечно что-то просто механическое, а не паталогия. Клавиатура сначала кажется непонятной, не привычной, но со временем пару недель, а лучше месяц спустя уже чувствуешь значительную разницу, как больно и не удобно печатать на ноуте, как я сейчас 🙂 или на обычных клавах. Конечно расчет идет не на поиск торрента или фильма в инетике, а именно про многочасовую печатную деятельность.

Блютуз норм.
Блютуз — норм. ) Не отваливается. Берет стабильно.

Кнопки отлично.
Ходит все. Не шаталось не разболталось. Иногда залипает. Но дело оказалось в крошках. Простучал все отлипло.

Колесико.
Отлично. По крайнем мере год спустя

Кнопка мышки назад.
Максимально удобное положение. В других дешевых все как то не там немного, и размер под палец не очень. У Sculpt большая прямо под большим пальцем, тихая.

Классный дизайн.
Не перестает радовать глаз. Для всех виндовс любителей отлично смотрится и работает. Я как бы больше маковод. Но все равно приятно. Серо-белую версию было бы неплохо.

Лязг пробела незаметен.
Вначале при покупке сказал, что пробел чуть более свободный. И лязгает совсем слегка, не так четко и тихо как остальные клавиши. Но вот прошло время, не замечаю и забыл уже.

Как то так получается. Некоторые замечания что применимы для любой клавиатуры, но с другой стороны некоторые же оказываются плюсами. И остальное в основном плюсы.

Надеюсь мой небольшой опыт будет полезен. ?


0
 

Django tinymce добавление загрузки картинок в редактор. (django tinymce upload image)

280

При стандартных настройках загрузка картинки не доступна. Редактор предлагает вставить внешний источник. Будь то это сторонний сток или полный путь до картинки на вашем сайте.

Как решить эту проблему.

Изначально скрипт вызова редактора находится app/main/static/django_tinymce/init_tinymce.js. У вас это может быть другой путь. Важно что в файле init_tinymce.js идет вызов редактора и сбор настроек из settings.py.

В моем случае конфиг выглядел так. Есть нюанс — в джанго конфиге нет возможности прописать коллбек-функции для реализации дополнительной обработки.

TINYMCE_DEFAULT_CONFIG = {
    "height": "320px",
    "width": "960px",
    "menubar": "file edit view insert format tools table help",
    "plugins": "media image preview advlist autolink lists link  charmap print preview anchor searchreplace visualblocks code "
               "fullscreen insertdatetime media table paste code help wordcount spellchecker",
    "toolbar": "undo redo | bold italic underline strikethrough | fontselect fontsizeselect formatselect | alignleft "
               "aligncenter alignright alignjustify | outdent indent |  numlist bullist checklist | forecolor "
               "backcolor casechange permanentpen formatpainter removeformat | pagebreak | charmap emoticons | "
               "fullscreen  preview save print | insertfile image media pageembed template link anchor codesample | "
               "a11ycheck ltr rtl | showcomments addcomment code",
    "custom_undo_redo_levels": 10,
    "language": "ru",  # To force a specific language instead of the Django current language.
    "image_title": "true",
    "image_caption": "true",
    "automatic_uploads": "true",
}

Можно прописать обработку в файле init_tinymce.js. Я не стал так делать. Хотя можете меня поправить. Если нормально, то можно и в нем. На строчке получения конфига перед инициализацией добавляем коллбек.

mce_conf.file_picker_callback = function (cb, value, meta) {
    var input = document.createElement("input");
    input.setAttribute("type", "file");
    if (meta.filetype == "image") {
        input.setAttribute("accept", "image/*");
    }
    if (meta.filetype == "media") {
        input.setAttribute("accept", "video/*");
    }
    input.onchange = function () {
        var file = this.files[0];
        var reader = new FileReader();
        reader.onload = function () {
            var id = "blobid" + (new Date()).getTime();
            var blobCache = tinymce.activeEditor.editorUpload.blobCache;
            var base64 = reader.result.split(",")[1];
            var blobInfo = blobCache.create(id, file, base64);
            blobCache.add(blobInfo);
            cb(blobInfo.blobUri(), {title: file.name});
        };
        reader.readAsDataURL(file);
    };
    input.click();
}
// Вызов редактора
tinyMCE.init(mce_conf);

1.Убираем стандартный вызов

Это был быстрый способ. Я же решил делать это обособлено в дополнительном скрипте.
Поэтому комментируем или удаляем конфиг из settings.py

2. Добавляем js

Как добавлять дополнительный css и js я рассказывал в другой статье. В данном случае подключение выглядит так.

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    class Media:
        css = {
            'all': (
                '/static/admin/css/custom.css',
            )
        }
        js = (
            '/static/admin/js/custom.js',
            )

Сам скрипт. В нем мы убираем редактор из дефолтного вызова tinymce и вызывает новый с нашими настройками. У вас могут быть другие плагины и стиль тулбара эдитора.

if ($('.tinymce').length) {
    tinymce.activeEditor.destroy();
}

tinymce.init({
    elements: "id_content",
    selector: "textarea#id_content",
    height: "700",
    width: "100%", menubar: "file edit view insert format tools table help",
    plugins: "media image preview advlist autolink lists link  charmap print preview anchor searchreplace visualblocks code fullscreen insertdatetime media table paste code help wordcount spellchecker",
    toolbar: "undo redo | bold italic underline strikethrough | fontselect fontsizeselect formatselect | alignleft aligncenter alignright alignjustify | outdent indent |  numlist bullist checklist | forecolor backcolor casechange permanentpen formatpainter removeformat | pagebreak | charmap emoticons | fullscreen  preview save print | insertfile image media pageembed template link anchor codesample | a11ycheck ltr rtl | showcomments addcomment code",
    image_title: true,
    image_caption: true,
    automatic_uploads: true,
    image_advtab: true,
    language: "ru",
    file_picker_types: "image media",
     // обработчик загрузчика файла
    file_picker_callback: function (cb, value, meta) {
        var input = document.createElement("input");
        input.setAttribute("type", "file");
        if (meta.filetype == "image") {
            input.setAttribute("accept", "image/*");
        }
        if (meta.filetype == "media") {
            input.setAttribute("accept", "video/*");
        }
        input.onchange = function () {
            var file = this.files[0];
            var reader = new FileReader();
            reader.onload = function () {
                var id = "blobid" + (new Date()).getTime();
                var blobCache = tinymce.activeEditor.editorUpload.blobCache;
                var base64 = reader.result.split(",")[1];
                var blobInfo = blobCache.create(id, file, base64);
                blobCache.add(blobInfo);
                cb(blobInfo.blobUri(), {title: file.name});
            };
            reader.readAsDataURL(file);
        };
        input.click();
    },
    content_style: "body { font-family:Helvetica,Arial,sans-serif; font-size:14px }"
});

И собственно на этом все.


Примечание: обязательно ставьте курсор на текст иначе будет ошибка при загрузке картинки. Редактор по умолчанию не загружает в папку, а вставляет картинку в BLOB формате

0
 

Django добавление кастомного контента и действий в админку(Django add custom actions and content in admin view)

261

Передо мной стояла задача гибко расширить функционал стандартной админки джанги.

Вьюшка таблицы

Рассмотрим добавление дополнительного действия в лист, на примере пользователей. Стандартный пример — выгрузка пользователей в Exel. Вы видим обычный лист с дефолтными действиями.

Добавим небольшой HTML в шапку. Для этого в admin.py нашего модуля добавим дополнительный класс, который будет переопределять отображение модели в админке.

from django.contrib import admin
from django.contrib.auth.models import User
#Переопределяем вывод модели Юзеров
class CustomAdminUsers(admin.ModelAdmin):
    readonly_fields = ['address_report']
    list_display = ('first_name', 'email', 'is_active', 'date_joined', 'last_login',)
    # определяем дополнительный темплейт
    change_list_template = "admin/user_profile_templ.html"  

admin.site.unregister(User)
admin.site.register(User, CustomAdminUsers)

change_list_template — собственно директива определяющая дополнительный шаблон.
Он находится по пути yourmodule/static/templates/admin

Сам шаблон. В нем форма и указанный экшн.

{% extends 'admin/change_list.html' %}
{% block object-tools %}
<form action="to-exel/" method="POST">
    {% csrf_token %}
    <input class="exel-btn" type="submit" value="Выгрузить  в Exel"/>
</form>
{{ block.super }}
{% endblock %}

Отлично у нас отобразился шаблон.

Теперь нужно обработать экшн а admin.py в нашем классе.

from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib import messages # сообщения джанги


#Переопределяем вывод модели Юзеров
class CustomAdminUsers(admin.ModelAdmin):
    readonly_fields = ['address_report']
    list_display = ('first_name', 'email', 'is_active', 'date_joined', 'last_login',)
    change_list_template = "admin/user_profile_templ.html" # определяем дополнительный темплейт
    
    # Определяем дополнительные урлы (код сам взял из stackoverflow)
    def get_urls(self):
        urls = super(CustomAdminUsers, self).get_urls()
        custom_urls = [url('^to-exel/$', self.to_exel, name='to_exel'), ]
        return custom_urls + urls
    # На обработчик
    def to_exel(self, request):
        # логика экшена
        messages.success(request, f"Пользователи успешно выгружены")
        return HttpResponseRedirect("../")

admin.site.unregister(User)
admin.site.register(User, CustomAdminUsers)

Собственно все для вьюшки листа.

Вьюшка редактирования модели

Теперь выведем дополнительную информацию в самой странице редактирования. Тут еще быстрее и проще. Ставим поле в readonly. И определяем функцию вывода. Либо текст, либо любой html. Соответсвенно можно брать любую информацию из других моделей и преобразовывать в нужный контент.

from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib import messages # сообщения джанги
from django.utils.html import format_html


#Переопределяем вывод модели Юзеров
class CustomAdminUsers(admin.ModelAdmin):
    readonly_fields = ['some_content']
    list_display = ('first_name', 'email', 'is_active', 'date_joined', 'last_login',)
    change_list_template = "admin/user_profile_templ.html" # определяем дополнительный темплейт
    
    # Дополнительный контент
    def some_content(self, instance):
        return format_html("<a href='%s'>%s</a>" % ('somelink.ru', 'Пример ссылки'))

    # Определяем дополнительные урлы (код сам взял из stackoverflow)
    def get_urls(self):
        urls = super(CustomAdminUsers, self).get_urls()
        custom_urls = [url('^to-exel/$', self.to_exel, name='to_exel'), ]
        return custom_urls + urls
    # На обработчик
    def to_exel(self, request):
        # логика экшена
        messages.success(request, f"Пользователи успешно выгружены")
        return HttpResponseRedirect("../")

admin.site.unregister(User)
admin.site.register(User, CustomAdminUsers)

Получаем результат в конце после редактируемых полей.

0
 

Django как добавить кастом стили и скрипты js css. (Django add custom styles and js)

291

https://gist.github.com/rg3915/26076942ef4b0564cfa4b398a92c9b51

Как то мне потребовалось немного изменить стиль и js админки. В частности мульти селекта.
Для этого потребовалось подключение кастомных скриптов и стилей.

Собственно для этого используется класс Media в admin.py при регистрации модели. Пути стилей идут от статики из папки admin.

from .models import Post


@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    class Media:
        css = {
            'all': ('/static/admin/css/custom.css',)
        }
        js = (
            '/static/admin/js/vendor/jquery/jquery.js',
            '/static/admin/js/vendor/select2/select2.full.js',
            '/static/admin/js/custom.js',
            )
0
 

October CMS BackendAuth получение данных бэкенд юзера

219

Иногда требуется информация от админа. То есть не просто юзера, а юзера именно из админки.
Для это используется класс BackendAuth.

use Backend\Facades\BackendAuth;

BackendAuth::check() // true false  проверка на юзера
BackendAuth::user() // вся информация о юзере
BackendAuth::user()->id // конкретное поле

Соответсвенно можете вытянуть любую нужную информацию

0
 

Woocommerce Почта РФ плагин фиксированная стоимость.

279

Есть плагин https://wordpress.org/support/plugin/russian-post-and-ems-for-woocommerce/.
У автора нет функционала фиксированной цены. По крайней мере на данный момент. Хотя в аналогичном сдек плагине это реализовано.

Как указано в топике самим автором https://wordpress.org/support/topic/фиксированная-стоимость-доставки/ можно сделать через фильтр.

add_filter( 'woocommerce_package_rates', 'override_ups_rates' );
function override_ups_rates( $rates ) {
    foreach( $rates as $rate_key => $rate ){
        // Check if the shipping method ID is UPS
        if( ($rate->method_id == 'rpaefw_post_calc') ) {
            // Set cost to zero
            $rates[$rate_key]->cost = 350;

        }
    }
    return $rates;
}

0
 

Woocommerce EKOM ошибка.

257

Почта России. Ошибка запроса для»price». CODE: 400 {«version_api»:2,»version»:»2.11.4.664″,»caption»:»Расчет тарифов»,»id»:53030,»name»:»ЕКОМ обыкновенный»,»mailtype»:53,»mailctg»:3,»directctg»:1,»from»:197022,»to»:919561,»weight»:100,»date»:20220701,»time»:230000,»postoffice»:[{«index»:197022,»tp»:1,»type»:3,»typei»:1,»name»:»САНКТ-ПЕТЕРБУРГ 22″,»regionid»:78,»regiono»:40000000,»region-main»:1,»area-main»:1,»placeid»:11102,»placeo»:40000000,»parent»:197000,»root»:190700,»courier»:190880,»pvz»:1,»item-check-view»:1,»move»:1,»weight-max»:20000,»pack-max»:99,»box»:190900},{«index»:919561,»tp»:2,»type»:16,»typei»:4,»name»:»РЯЗАНЬ-ПОЧТОМАТ (АПС)»,»regionid»:62,»regiono»:61701000001,»region-main»:1,»area-main»:1,»placeid»:17796,»placeo»:61701000001,»parent»:390700,»root»:390700,»partner»:1,»move»:1,»weight-max»:30000,»pay-card»:1,»rent»:1}],»errors»:[{«msg»:»ЕКОМ обыкновенный. Плата за доставку ЕКОМ (2635). ЕКОМ нельзя принять в 197022 \»САНКТ-ПЕТЕРБУРГ 22\». (1.11).»,»type»:1,»code»:2004}],»place»:»C5-r00-1″}

Сам задал сам отвечу)

Так понял, что указал ОПС который не поддерживает EKOM.
Соотв нужно указать тот, в котором есть.

0
 

Woocommerce javascript события (events)

273

Еще одна шпаргалка вновь :). Теперь по js событиям, которые можно использовать в определенных модулях woocommerce. Дело в том, что как бы ни хотелось или как бы ни не хотелось влезать скрипты checkout.js, cart.js, порой необходимо дописать некоторую логику, которая возникает после обновления корзины или обновления страницы checkout и тд.

//Woocommerce Checkout JS events
$( document.body ).trigger( 'init_checkout' );
$( document.body ).trigger( 'payment_method_selected' );
$( document.body ).trigger( 'update_checkout' );
$( document.body ).trigger( 'updated_checkout' );
$( document.body ).trigger( 'checkout_error' );
$( document.body ).trigger( 'applied_coupon_in_checkout' );
$( document.body ).trigger( 'removed_coupon_in_checkout' );

//Woocommerce cart page JS events
$( document.body ).trigger( 'wc_cart_emptied' );
$( document.body ).trigger( 'update_checkout' );
$( document.body ).trigger( 'updated_wc_div' );
$( document.body ).trigger( 'updated_cart_totals' );
$( document.body ).trigger( 'country_to_state_changed' );
$( document.body ).trigger( 'updated_shipping_method' );
$( document.body ).trigger( 'applied_coupon', [ coupon_code ] );
$( document.body ).trigger( 'removed_coupon', [ coupon ] );

//Woocommerce Add to cart JS events
$( document.body ).trigger( 'adding_to_cart', [ $thisbutton, data ] );
$( document.body ).trigger( 'added_to_cart', [ response.fragments, response.cart_hash, $thisbutton ] );
$( document.body ).trigger( 'removed_from_cart', [ response.fragments, response.cart_hash, $thisbutton ] );
$( document.body ).trigger( 'wc_cart_button_updated', [ $button ] );
$( document.body ).trigger( 'cart_page_refreshed' );
$( document.body ).trigger( 'cart_totals_refreshed' );
$( document.body ).trigger( 'wc_fragments_loaded' );

$( document.body ).trigger( 'init_add_payment_method' );

//Использование
jQuery('<event_target>').on('<event_name>', function(){
    console.log('<event_name> triggered');
});

//Пример
jQuery('body').on('init_checkout', function(){
    console.log('init_checkout triggered');
    // now.do.whatever();
});



0
 

Woocommerce шпараглка по корзине. Get cart data

251

Еще одна шпаргалочка, только уже по корзине

// $cart conditionals (if)
 WC()->cart->is_empty()
 WC()->cart->needs_payment()
 WC()->cart->show_shipping()
 WC()->cart->needs_shipping()
 WC()->cart->needs_shipping_address()
 WC()->cart->display_prices_including_tax()
 // Get $cart totals
 WC()->cart->get_cart_contents_count();
 WC()->cart->get_cart_subtotal();
 WC()->cart->subtotal_ex_tax;
 WC()->cart->subtotal;
 WC()->cart->get_displayed_subtotal();
 WC()->cart->get_taxes_total();
 WC()->cart->get_shipping_total();
 WC()->cart->get_coupons();
 WC()->cart->get_coupon_discount_amount( 'coupon_code' );
 WC()->cart->get_fees();
 WC()->cart->get_discount_total();
 WC()->cart->get_total();
 WC()->cart->total;
 WC()->cart->get_tax_totals();
 WC()->cart->get_cart_contents_tax();
 WC()->cart->get_fee_tax();
 WC()->cart->get_discount_tax();
 WC()->cart->get_shipping_total();
 WC()->cart->get_shipping_taxes();
 // Loop over $cart items
 foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
    $product = $cart_item['data'];
    $product_id = $cart_item['product_id'];
    $quantity = $cart_item['quantity'];
    $price = WC()->cart->get_product_price( $product );
    $subtotal = WC()->cart->get_product_subtotal( $product, $cart_item['quantity'] );
    $link = $product->get_permalink( $cart_item );
    // Anything related to $product, check $product tutorial
    $attributes = $product->get_attributes();
    $whatever_attribute = $product->get_attribute( 'whatever' );
    $whatever_attribute_tax = $product->get_attribute( 'pa_whatever' );
    $any_attribute = $cart_item['variation']['attribute_whatever'];
    $meta = wc_get_formatted_cart_item_data( $cart_item );
 }
 // Get $cart customer billing / shipping
 WC()->cart->get_customer()->get_billing_first_name();
 WC()->cart->get_customer()->get_billing_last_name();
 WC()->cart->get_customer()->get_billing_company();
 WC()->cart->get_customer()->get_billing_email();
 WC()->cart->get_customer()->get_billing_phone();
 WC()->cart->get_customer()->get_billing_country();
 WC()->cart->get_customer()->get_billing_state();
 WC()->cart->get_customer()->get_billing_postcode();
 WC()->cart->get_customer()->get_billing_city();
 WC()->cart->get_customer()->get_billing_address();
 WC()->cart->get_customer()->get_billing_address_2();
 WC()->cart->get_customer()->get_shipping_first_name();
 WC()->cart->get_customer()->get_shipping_last_name();
 WC()->cart->get_customer()->get_shipping_company();
 WC()->cart->get_customer()->get_shipping_country();
 WC()->cart->get_customer()->get_shipping_state();
 WC()->cart->get_customer()->get_shipping_postcode();
 WC()->cart->get_customer()->get_shipping_city();
 WC()->cart->get_customer()->get_shipping_address();
 WC()->cart->get_customer()->get_shipping_address_2();
 // Other stuff
 WC()->cart->get_cross_sells();
 WC()->cart->get_cart_item_tax_classes_for_shipping();
 WC()->cart->get_cart_hash();
 WC()->cart->get_customer();
0
 

Woocommerce шпаргалка по Orders. Get orders data.

243

В некоторых задачах требуется получить объект заказа.
Вот некоторая шпаргалка.

// Get Order ID and Key
 $order->get_id();
 $order->get_order_key();
 // Get Order Totals $0.00
 $order->get_formatted_order_total();
 $order->get_cart_tax();
 $order->get_currency();
 $order->get_discount_tax();
 $order->get_discount_to_display();
 $order->get_discount_total();
 $order->get_fees();
 $order->get_formatted_line_subtotal();
 $order->get_shipping_tax();
 $order->get_shipping_total();
 $order->get_subtotal();
 $order->get_subtotal_to_display();
 $order->get_tax_location();
 $order->get_tax_totals();
 $order->get_taxes();
 $order->get_total();
 $order->get_total_discount();
 $order->get_total_tax();
 $order->get_total_refunded();
 $order->get_total_tax_refunded();
 $order->get_total_shipping_refunded();
 $order->get_item_count_refunded();
 $order->get_total_qty_refunded();
 $order->get_qty_refunded_for_item();
 $order->get_total_refunded_for_item();
 $order->get_tax_refunded_for_item();
 $order->get_total_tax_refunded_by_rate_id();
 $order->get_remaining_refund_amount();
 // Get and Loop Over Order Items
 foreach ( $order->get_items() as $item_id => $item ) {
    $product_id = $item->get_product_id();
    $variation_id = $item->get_variation_id();
    $product = $item->get_product();
    $product_name = $item->get_name();
    $quantity = $item->get_quantity();
    $subtotal = $item->get_subtotal();
    $total = $item->get_total();
    $tax = $item->get_subtotal_tax();
    $taxclass = $item->get_tax_class();
    $taxstat = $item->get_tax_status();
    $allmeta = $item->get_meta_data();
    $somemeta = $item->get_meta( '_whatever', true );
    $product_type = $item->get_type();
 }
 // Other Secondary Items Stuff
 $order->get_items_key();
 $order->get_items_tax_classes();
 $order->get_item_count();
 $order->get_item_total();
 $order->get_downloadable_items();
 $order->get_coupon_codes();
 // Get Order Lines
 $order->get_line_subtotal();
 $order->get_line_tax();
 $order->get_line_total();
 // Get Order Shipping
 $order->get_shipping_method();
 $order->get_shipping_methods();
 $order->get_shipping_to_display();
 // Get Order Dates
 $order->get_date_created();
 $order->get_date_modified();
 $order->get_date_completed();
 $order->get_date_paid();
 // Get Order User, Billing & Shipping Addresses
 $order->get_customer_id();
 $order->get_user_id();
 $order->get_user();
 $order->get_customer_ip_address();
 $order->get_customer_user_agent();
 $order->get_created_via();
 $order->get_customer_note();
 $order->get_address_prop();
 $order->get_billing_first_name();
 $order->get_billing_last_name();
 $order->get_billing_company();
 $order->get_billing_address_1();
 $order->get_billing_address_2();
 $order->get_billing_city();
 $order->get_billing_state();
 $order->get_billing_postcode();
 $order->get_billing_country();
 $order->get_billing_email();
 $order->get_billing_phone();
 $order->get_shipping_first_name();
 $order->get_shipping_last_name();
 $order->get_shipping_company();
 $order->get_shipping_address_1();
 $order->get_shipping_address_2();
 $order->get_shipping_city();
 $order->get_shipping_state();
 $order->get_shipping_postcode();
 $order->get_shipping_country();
 $order->get_address();
 $order->get_shipping_address_map_url();
 $order->get_formatted_billing_full_name();
 $order->get_formatted_shipping_full_name();
 $order->get_formatted_billing_address();
 $order->get_formatted_shipping_address();
 // Get Order Payment Details
 $order->get_payment_method();
 $order->get_payment_method_title();
 $order->get_transaction_id();
 // Get Order URLs
 $order->get_checkout_payment_url();
 $order->get_checkout_order_received_url();
 $order->get_cancel_order_url();
 $order->get_cancel_order_url_raw();
 $order->get_cancel_endpoint();
 $order->get_view_order_url();
 $order->get_edit_order_url();
 // Get Order Status
 $order->get_status();
 // Get Thank You Page URL
 $order->get_checkout_order_received_url();
0