Задать вопрос
  • Как физлицу выгодно продать домен другому физлицу?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    продал через reg.ru - они забрали 10% - да и фиг с ними - всё нормально прошло
    Ответ написан
    Комментировать
  • Уплата налога с прибыли от YouTube-канала за 2020 год - как правильно?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Нашел подробную инструкцию как и что делать: https://www.youtube.com/watch?v=gLk50s8Pfpw
    Ответ написан
    Комментировать
  • Долго подгружается страница создания/редактирования товара WooCommerce?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    И надо же отключил Yoast SEO - эффект зависания пропал - корень зла Yoast выходит!
    Ответ написан
  • Уникальный набор похожих записей кастомного типа в WordPress?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Пока что быстренько набросал такой некрасивый вариант без учета влезания в соседние категории - нужно будет доделать потом:

    $_product_id = get_the_ID();
    $cat_ids = wp_get_object_terms( $_product_id, 'cats', array('fields'=>'ids') );
    if ( is_array($cat_ids) and count($cat_ids) ) {
        $_posts = get_posts( array(
            'numberposts' => -1,
            'post_type'   => 'product',
            'tax_query' => array(
                array(
                    'taxonomy' => 'cats',
                    'field' => 'id',
                    'terms' => $cat_ids,
                    'include_children' => true,
                )
            ),
        ) );
    
        if ( is_array($_posts) and count($_posts) ) {
            foreach ($_posts as $_post) {
                $_index[] = $_post->ID;
                $_posts_ids[$_post->ID] = $_post;
            }
    
            $post_index = array_search( $_product_id, $_index );
    
            if ($post_index) {
    
                $_products_ids = array();
                $_index_count = count($_index);
    
                if ( isset($_index[$post_index-2]) )
                    $_products_ids[] = $_index[$post_index-2];
                elseif ($post_index-1 == 0)
                    $_products_ids[] = $_index[$_index_count-1];
                else 
                    $_products_ids[] = $_index[$_index_count-2];
    
                if ( isset($_index[$post_index-1]) )
                    $_products_ids[] = $_index[$post_index-1];
                else
                    $_products_ids[] = $_index[$_index_count-1];
    
                if ( isset($_index[$post_index+1]) )
                    $_products_ids[] = $_index[$post_index+1];
                else
                    $_products_ids[] = $_index[0];
    
                if ( isset($_index[$post_index+2]) )
                    $_products_ids[] = $_index[$post_index+2];
                elseif ($post_index == $_index_count-1)
                    $_products_ids[] = $_index[1];
                else
                    $_products_ids[] = $_index[0];
    
                if ( count($_products_ids) ) {
                    foreach ($_products_ids as $_id) {
                        if ( is_object($_posts_ids[$_id]) )
                            $_products[$_id] = $_posts_ids[$_id];
                    }
                }
            }
        }
    }
    Ответ написан
    Комментировать
  • Первый товар из категории WooCommerce?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    $_first_product = get_posts( array(
        'numberposts' => 1,
        'post_type'   => 'product',
        'category' => $_categories,
        'post_status' => 'publish',
        //'orderby'=>'menu_order',
        'order'=>'ASC',
    ) );
    
    if ( is_array($_first_product) and count($_first_product) and $_first_product[0]->ID == $_product_id ) 
        $_is_first_product = true;


    если $_is_first_product = true значит это первый по порядку товар в категории
    в $_categories - ID-шник категории текущего товара
    Ответ написан
    Комментировать
  • Как после нажатия кнопок в сообщении от Telegram-Bot'а скрыть их?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Разобрался и вот небольшой примерчик (вырезка):

    $telegram = new Telegram\Bot\Api('XXXXXXXXXXXXXXXXXXXX');
    $update = $this->telegram->getWebhookUpdates();
    $update = json_decode($this->update, true);
    
    $keyboard = Keyboard::make()->inline()->row(Keyboard::inlineButton(['text' => 'One more?','callback_data' => '/random']));
    
    $telegram->editMessageText([
        'chat_id' => $update['callback_query']['message']['chat']['id'],
        'message_id' => $update['callback_query']['message']['message_id'],
        'text' => 'Ответочка',
        'reply_markup' => $keyboard,
        'parse_mode' => 'markdown',
    ]);
    Ответ написан
    Комментировать
  • Как правильно передать callback в telegram-bot?

    @easycode
    не боюсь задавать глупые вопросы ))
    Понимаю, что уже не актуально, но вот совсем недавно нужно было писать еще одного бота на этой же библиотеке. Я воспользовался своим старым "скелетом":

    require_once( dirname(__FILE__) . '/vendor/autoload.php');
    
    use Telegram\Bot\Commands\Command;
    use Telegram\Bot\Keyboard\Keyboard;
    
    class TelegaBot {
    
        public $chat = array();
    
        public $chat_id;
    
        public $message;
    
        public $telegram;
    
        public $lastCommand = '';
    
        public $text;
    
        public $reply;
        
        public $keyboard = array();
    
    function __construct()
        {
    $this->telegram = new Telegram\Bot\Api('XXXXXXXXXXXXXXXXXXXXX');
    
    $this->update = $this->telegram->getWebhookUpdates();
    
    if ( isset($this->update['callback_query'])) {
        $this->message = $this->update['callback_query'];
    } else {
        $this->message = $this->update;
    }
    
    $this->chat_id = $this->message['message']['chat']['id'];
    
    $this->text = $this->message["message"]["text"];
    
    if ($this->chat_id) {
    
        $this->chat['username'] = $this->message['message']['from']['username'];
        $this->chat['name'] = $this->message['message']['from']['first_name'];
    
        // если передается команда, то запоминаем её
        if ( preg_match('|/([a-z0-9_]{3,})|is', $this->text, $buff) and trim($buff[1]) != '') {
            $this->lastCommand = $buff[1];
        }
    
        // ловин нажатие по кнопке:
        if (isset($this->update['callback_query'])) {
            if ($this->message['data']) {
                $this->lastCommand = $this->message['data'];
            }
        }
    }
    
    if ($this->lastCommand) {
        $method = 'cmd_' . $this->lastCommand;
        if (method_exists('TGBot', $method)) {
            call_user_func(array($this, $method));       
        } else {
            $this->reply = "Что-то не припомню такой команды :=)\n\nПожалуйста, пользуйтесь кнопками в моих сообщениях или если вдруг чувствуете, что я начал подглюкивать сообщите об этом моему разработчику...";
        }
    }
    
    
    private function cmd_start()
    {
        $this->keyboard = [
            [
                Keyboard::inlineButton(['text' => 'Кнопка 1', 'callback_data' => 'button1']),
                Keyboard::inlineButton(['text' => 'Кнопка 2', 'callback_data' => 'button2'])
            ]
        ];
        return $this->sendMessage();
    
    }
    
    public function cmd_button1()
    {
        // функционал реакции бота на нажатия кнопки 1
    }
    
    
    public function sendMessage()
    {
        $data = array(
            'chat_id' => chat_id,
            'text' => $this->reply,
        );
        if (count($this->keyboard) and is_array($this->keyboard)) {
            $data['reply_markup'] = $this->telegram->replyKeyboardMarkup([ 
                'inline_keyboard' => $this->keyboard, 
                'resize_keyboard' => true, 
                'one_time_keyboard' => true, 
            ]);
        }
    
        $this->telegram->sendMessage($data);
    }


    весь код класса не привожу, но самое главное что в callback_query я не пишу слэши перед командами если заметили:
    Keyboard::inlineButton(['text' => 'Кнопка 1', 'callback_data' => 'button1']),


    мне так удобнее отличать команду от нажатия на кнопку ) хотя по сути это тоже команда )
    Ответ написан
    Комментировать
  • Как создавать блоки для Visual Composer?

    @easycode
    не боюсь задавать глупые вопросы ))
    Судя по ответам - Вас или не поняли или не особо вдавались в Ваш вопрос.
    Вы наверняка нашли материалы по данной теме.
    Один из: https://webdesign.tutsplus.com/ru/tutorials/how-to...
    Ответ написан
    Комментировать
  • Использовать WooCommerce для оплаты в своём плагине?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Кажется я уже нашёл вариант, осталось только применить и затестить:

    if (isset($_POST['isOrder']) && $_POST['isOrder'] == 1) {
        $address = array(
            'first_name' => $_POST['notes']['domain'],
            'last_name'  => '',
            'company'    => $_POST['customer']['company'],
            'email'      => $_POST['customer']['email'],
            'phone'      => $_POST['customer']['phone'],
            'address_1'  => $_POST['customer']['address'],
            'address_2'  => '', 
            'city'       => $_POST['customer']['city'],
            'state'      => '',
            'postcode'   => $_POST['customer']['postalcode'],
            'country'    => 'NL'
        );
     
        $order = wc_create_order();
        foreach ($_POST['product_order'] as $productId => $productOrdered) :
            $order->add_product( get_product( $productId ), 1 );
        endforeach;
     
        $order->set_address( $address, 'billing' );
        $order->set_address( $address, 'shipping' );
     
        $order->calculate_totals();
     
        update_post_meta( $order->id, '_payment_method', 'ideal' );
        update_post_meta( $order->id, '_payment_method_title', 'iDeal' );
     
        // Store Order ID in session so it can be re-used after payment failure
        WC()->session->order_awaiting_payment = $order->id;
     
        // Process Payment
        $available_gateways = WC()->payment_gateways->get_available_payment_gateways();
        $result = $available_gateways[ 'ideal' ]->process_payment( $order->id );
     
        // Redirect to success/confirmation/payment page
        if ( $result['result'] == 'success' ) {
     
            $result = apply_filters( 'woocommerce_payment_successful_result', $result, $order->id );
     
            wp_redirect( $result['redirect'] );
            exit;
        }
    }
    Ответ написан
    Комментировать
  • Нужно организовать оплату в Интернет-магазине на WooCommece через Uniteller - есть идеи?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Написал еще тогда быстрое решение: https://github.com/enshtein/wc-uniteller
    Настроек не много, там что-то с типом налогооблажения в коде осталось.
    Появится время запилю плагин и выложу в каталог WordPress.
    Ответ написан
    Комментировать
  • Не работает HTTP-аунтификация на HTTPS-сайте?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Так как на моём хостинг был: PHP FastCGI, то после того как я дописал в конец .htaccess строчку:

    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]


    всё заработало как и должно было!
    Ответ написан
    Комментировать
  • Плагин-сканер WordPress для обнаружения и зачистки malware injection в БД?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Написал в поддержку Wordfence Security - надеюсь они добавят сигнатуру этого кода в свою базу )
    Ответ написан
    Комментировать
  • Программы вылетают из автозагрузки Windows 10 - что делать?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Переустановил пару программ, т.е. даже не все и всё стало нормально - всё остается в Автозагрузке как и было ранее. Не знаю что это было - но переустановка помогла!
    Ответ написан
    Комментировать
  • Большой многоязычный магазин на WooCommerce в сети WordPress Multisite с синхронизацией 1С - как организовать всё?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Пока что остановились на конфигурации WordPress + WooCommerce + Polylang Pro + Polylang for WooCommerce
    Размножили 7 тыс. товаров по еще 2 языкам, итого: 21 тыс. товаров в базе, у каждого товара атрибуты в мета-полях.

    На мощном серваке страницы генерируются за 0,2-0,5 секунд - для нас более чем прекрасные результаты!
    Ответ написан
    Комментировать
  • Как называется jQuery редактор?

    @easycode
    не боюсь задавать глупые вопросы ))
    Уже явно, наверное, не актуально, но оставлю здесь: https://github.com/Kademi/keditor
    Ответ написан
    Комментировать
  • Как закрепить блок в Worpdress чтобы он был на всех страницах?

    @easycode
    не боюсь задавать глупые вопросы ))
    В файл functions.php в папке активной темы добавить код (можно в конец файла, но до закрывающего тега: ?> - если он там есть, а если его нет то просто в конец файла):
    register_sidebar(array(
            'name' => 'Мой блок',
            'before_widget' => '',
            'after_widget' => '',
            'before_title' => '<div class="title">',
            'after_title' => '</div>',
        ));


    далее, вам нужно определиться где будет расположен ваш блок - в каком месте страницы, если в подвале - то смотрите в файл footer.php, если в шапке - то возможно header.php. Тут всё очень тонко и зависит от конкретной темы, потому что разработчики тем могут чудить как угодно - у них полная свобода в этом, в footer.php или header.php - может вовсе не быть HTML-кода в рамках которого вы и должны действовать. Тогда Вам придется поискать в коде других файлов нужное место для вашего блока и когда вы его найдете вставьте туда:
    <?php dynamic_sidebar("Мой блок"); ?>

    опять же если будете вставлять внутри php-кода, то дескрипторы <?php и ?> не нужны будут - иначе получите или ошибку или ненужные символы на сайте.

    на у далее идете в Внешний вид / Виджеты и там появится колонка с названием: "Мой блок" - добавляете туда нужный Вам виджет и всё - как-то так )

    Но! Без хотя бы минимальных знаний HTML и понимания как устроены темы WordPress изнутри будет сложно разобраться. Установить хотя бы тот же Sublime Text редактор, добавьте туда папку с Вашей темой и через Ctrl + Shift + F можно искать нужный вам HTML-кусок кода во всех файлах этой папки, так порой приходится изощряться чтобы найти куда создатели темы запрятали окружающий нужное мне место HTML-код.
    Ответ написан
    1 комментарий
  • 1С Бухгалтерия не создает счет при загрузке заказов с сайта?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    УРА! Разобрался.
    Для начала очень важная настройка:
    5e21e894323cf924871177.png
    по причине её у меня не загружались заказы в 1Ске, а далее я взял образец XML с сайта: https://www.cs-cart.ru/docs/4.3.x/developer/1c/ord... и он подошёл:

    5e21ea0f43aa2430708347.png

    <?xml version="1.0" encoding="utf-8"?>
    <КоммерческаяИнформация ВерсияСхемы="2.03" ДатаФормирования="2020-01-17">
    <Документ>
    	<Ид>108</Ид>
    	<Номер>108</Номер>
    	<Дата>2020-01-17</Дата>
    	<ХозОперация>Заказ товара</ХозОперация>
    	<Роль>Продавец</Роль>
    	<Валюта>руб</Валюта>
    	<Курс>1</Курс>
    	<Сумма>140.00</Сумма>
    	<Контрагенты>
    		<Контрагент>
    			<Ид>62E1BAD5-97D9-4A6D-AE51-51DBD6780837</Ид>
    			<Наименование>New New</Наименование>
    			<Роль>Покупатель</Роль>
    			<ПолноеНаименование>New New</ПолноеНаименование>
    			<Фамилия>New</Фамилия>
    			<Имя>New</Имя>
    			<АдресРегистрации>
    				<Представление>520111, Российская Федерация, Красноярск, Красная</Представление>
    				<АдресноеПоле>
    					<Тип>Почтовый индекс</Тип>
    					<Значение>520111</Значение>
    				</АдресноеПоле>
    				<Контакты>
    					<Контакт>
    						<Тип>Почта</Тип>
    						<Значение>new@test.test</Значение>
    					</Контакт>
    					<Контакт>
    						<Тип>Телефон</Тип>
    						<Значение>+79512111111</Значение>
    					</Контакт>
    				</Контакты>
    			</АдресРегистрации>
    			<Представители>
    				<Представитель>
    					<Контрагент>
    						<Отношение>Контактное лицо</Отношение>
    						<Ид>62E1BAD5-97D9-4A6D-AE51-51DBD6780837</Ид>
    						<Наименование>Покупатель</Наименование>
    					</Контрагент>
    				</Представитель>
    			</Представители>
    		</Контрагент>
    	</Контрагенты>
    	<Время>17:12:09</Время>
    	<Комментарий/>
    	<Товары>
    		<Товар>
    			<Ид>FF0AB9DD-D3B4-4AC6-9C54-2A4CE415000D</Ид>
    			<Наименование>Nike "Untouchable" Women's Tank Top</Наименование>
    			<БазоваяЕдиница Код="796" НаименованиеПолное="Штука" МеждународноеСокращение="PCE">шт</БазоваяЕдиница>
    			<ЦенаЗаЕдиницу>25.00</ЦенаЗаЕдиницу>
    			<Количество>1</Количество>
    			<Сумма>25</Сумма>
    			<ЗначенияРеквизитов>
    				<ЗначениеРеквизита>
    					<Наименование>ВидНоменклатуры</Наименование>
    					<Значение>Товар</Значение>
    				</ЗначениеРеквизита>
    				<ЗначениеРеквизита>
    					<Наименование>ТипНоменклатуры</Наименование>
    					<Значение>Товар</Значение>
    				</ЗначениеРеквизита>
    			</ЗначенияРеквизитов>
    		</Товар>
    	</Товары>
    	<ЗначенияРеквизитов>
    		<ЗначениеРеквизита>
    			<Наименование>Статус заказа</Наименование>
    			<Значение>Принят</Значение>
    		</ЗначениеРеквизита>
    		<ЗначениеРеквизита>
    			<Наименование>Метод оплаты</Наименование>
    			<Значение>Заказ по телефону</Значение>
    		</ЗначениеРеквизита>
    	</ЗначенияРеквизитов>
    </Документ>
    </КоммерческаяИнформация>
    Ответ написан
    9 комментариев
  • Как настроить синхронизацию своего php-скрипта с 1С Бухгалтерия?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Ответ написан
    Комментировать
  • Как организовать работу взаимозависимых фильтров товаров в WordPress-плагине?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Пока что обошелся ранее мною описанным подходом:

    <?php
    
    // $data - это массив передающийся в AJAX-запросе фильтрации товаров
    
    // параметры основного запроса получения товаров для вывода на странице
    $args = array(
    	'post_type' => 'product',
    	'posts_per_page' => $data['page_count'] ? $data['page_count'] : 16,
    	'post_status' => 'publish',
    	'tax_query' => array(
            array(
                'taxonomy' => 'cats', 
                'field' => 'term_id', 
                'terms' => $_cat_id,
            )
        )
    );
    // если пагинация
    if ( is_numeric($data['page']) )  {
    	$args['paged'] = (int) $data['page'];
    }
    
    $_filter_post_ids = array();
    
    if (count($data['filters'])) { // если выбран хотя бы один фильтр
    	$args['meta_query'] = array(
    		'relation' => 'AND',
    	);
    	foreach ($data['filters'] as $_filter => $_values) {
    		// собираем фильтрацию
    		$args['meta_query'][] = array(
    			'key' => $_filter,
    			'value' => (array) $_values,
    		);
    	}
    
    	// собираем ID всех товаров выбранных в результе фильтрации
    	$args_filters = $args;
    	$args_filters['posts_per_page'] = -1;
    	$_posts = get_posts( $args_filters );
    	if ( count($_posts) ) {
    		foreach ($_posts as $_post) {
    			$_filter_post_ids[] = $_post->ID;
    		}
    		$in = " AND `post_id` IN (" . implode(',', $_filter_post_ids) . ')';
    	}
    
    	// получаем массивы значений фильтров для вывода в интерфейсе фильтрации товаров
    	foreach ($_filters_list as $_filter_name) {
    		$_filter_values = $wpdb->get_results("SELECT `meta_value`, COUNT(meta_id) AS `counts` FROM `{$wpdb->prefix}postmeta` WHERE `meta_key` = '$_filter_name' AND `meta_value` != ''$in GROUP BY `meta_value`", ARRAY_A);
    		if (count($_filter_values)) {
    			foreach ($_filter_values as $_value) {
    				$_filters_data[$_filter_name][$_value['meta_value']] = $_value['counts'];
    			}
    		}
    	}
    }
    
    $wp_query = new WP_Query( $args );


    Спорное решение - но работает и пока на небольшом кол-ве товаров в базе и кол-ве фильтров до 10 вроде не тормозит, посмотрим что будет дальше, возможно придется все переделывать иначе... но пока так...
    Ответ написан
    Комментировать
  • Как передавать параметры при вызове команды через Plesk REST API?

    @easycode Автор вопроса
    не боюсь задавать глупые вопросы ))
    Оказалось всё просто:

    var_dump( setRequest(
    	'https://XXX.XXX.XXX.XXX:8443/api/v2/cli/autoresponder/call',
    	array(
    		'X-API-Key: c1986243-c4b7-0fc3-d543-67u9ad3a000a',
    	), 
    	array(
    		'params'=> array(
    			'--update',
    			'-mail',
    			'administrator@mydomen.ru',
    			'-status',
    			'true',
    			'-subject',
    			'Re: this subject text',
    			'-text',
    			'This is text email message!',
    		),
    	)
    ) );


    Параметры пишутся как элементы массива по порядку - так как бы они шли в команде CLI, см. https://docs.plesk.com/en-US/onyx/cli-linux/using-...
    Ответ написан
    Комментировать