• Плагин для добавления автоматических отзывов WordPress?

    Обычно свои наработки не выкладываю, но вот держите:

    Сама html-форма:
    html-код
    <form class="form-wrapper reviews-form" id="reviews-form">
    					<h3>Оставить отзыв</h3>
    					<div class="reviews-form__row">
    						<div class="form-wrapper__group">
    							<input type="text" name="name" value="" placeholder="Ваше имя" required>
    						</div>
    						<div class="form-wrapper__group">
    							<input type="text" name="email" value="" placeholder="Ваш e-mail" required>
    						</div>
    						<div class="reviews-form__mark-wrapper">
    							<ul class="reviews-form__marks-list">
    								<li><button class="green" data-review-mark="positive"><img src="<?php echo get_template_directory_uri(); ?>/images/svg/happy.svg" alt="Положительный" class="svg"></button></li>
    								<li><button class="yellow" data-review-mark="medium"><img src="<?php echo get_template_directory_uri(); ?>/images/svg/surprised.svg" alt="Удовлетворительный" class="svg"></button></li>
    								<li><button class="red" data-review-mark="negative"><img src="<?php echo get_template_directory_uri(); ?>/images/svg/sad.svg" alt="Отрицательный" class="svg"></button></li>
    							</ul>
    						</div>
    					</div>
    					<div class="reivews-form__message-wrapper">
    						<textarea name="message" placeholder="Ваш отзыв" required></textarea>
    						<input type="hidden" name="rating" value="" required>
    					</div>
    					<button type="submit" class="button button--green">Оставить отзыв</button>
    				</form>

    Обработчики форм:
    /**
          * @module       Marks
          * @description  Выставление оценки в форме
          */
         $('button[data-review-mark]').on('click',function(e){
           e.preventDefault();
           $('button[data-review-mark]').removeClass('active');
           $(this).addClass('active');
           $('#reviews-form').find('[name="rating"]').val($(this).attr('data-review-mark'));
         });

    /**
         * @module       Добавление отзыва
         * @description  Добавление отзыва
         */
        $('#reviews-form').submit(function(e) {
          e.preventDefault();
          $.ajax({
            type: "POST",
            url: "/api/newreview.php",
            data: $(this).serialize(),
            success: function(){
              $('#successreviewmodal').modal('show');
            },
            error: function() {
              $('#errormodal').modal('show');
            }
          });
        });



    Так как запрос отсылается на /api/newreview.php, то по этому адресу у вас должен располагаться этот файл со следующим кодом:

    Код newreview.php:
    <?php
    ini_set("display_errors",1);
    error_reporting(E_ALL);
    
    // *
    // Подключаем все файлы для работы
    // *
    require_once( $_SERVER['DOCUMENT_ROOT'].'/wp-load.php');
    require_once( ABSPATH . 'wp-admin/includes/image.php' );
    require_once( ABSPATH . 'wp-admin/includes/file.php' );
    require_once( ABSPATH . 'wp-admin/includes/media.php' );
    
    
    $user_name = trim($_POST['name']);
    $user_mail = trim($_POST['email']);
    $message = trim($_POST['message']);
    $rating  = trim($_POST['rating']);
    
    $post_data = array(
    	'post_title'    => 'Отзыв #' . uniqid(),
    	'post_content'  => $message,
    	'post_status'   => 'pending',
    	'post_author'   => 1,
      'post_type'     => 'reviews'
    );
    
    // Вставляем запись в базу данных
    $post_id = wp_insert_post( $post_data );
    // *
    // Добавляем все дополнительные поля
    // *
    update_field( 'rating', $rating, $post_id );
    update_field( 'author', $user_name, $post_id );
    update_field( 'e-mail', $user_email, $post_id );
    
    
    
    ?>



    Так как у нас пост добавляется в кастомный тип записей, нужно его сначала создать. Для этого в файл functions.php добавляем следующее:

    Кастомный тип записей
    /**
     * Кастомный тип записей:  Отзывы
     */
    function create_posttype_reviews() {
      register_post_type( 'reviews',
        array(
          'labels' => array(
            'name' => __( 'Отзывы' ),
            'singular_name' => __( 'Отзывы' )
          ),
          'public' => true,
          'has_archive' => false,
          'rewrite' => array('slug' => 'reviews'),
        )
      );
    }
    add_action( 'init', 'create_posttype_reviews' );



    На этом все. В админке wordpress у вас появится новый блок меню "Отзывы", куда и будут попадать все отзывы. В качестве бонуса, могу вам прикрепить код, который надо поместить в functions.php, благодаря которому, боявится балун с количеством неопубликованных отзывов (так проще их отслеживать):

    php код
    /**
     * Уведомления о новых неопубликованных постах
     */
    
    add_action( 'admin_menu', 'add_user_menu_bubble' );
    function add_user_menu_bubble(){
    	global $menu;
    
    	// Отзывы
    	$count = wp_count_posts('reviews')->pending; // на подтверждении
    	if( $count ){
    		foreach( $menu as $key => $value ){
    			if( $menu[$key][2] == 'edit.php?post_type=reviews' ){
    				$menu[$key][0] .= ' <span class="awaiting-mod"><span class="pending-count">' . $count . '</span></span>';
    				break;
    			}
    		}
    	}
    }



    P.S не забудьте проверять всю информацию, поступающую от клиента.

    UPD: забыл добавить, чтобы отзывы где-то выводились, вам нужно в каком-то месте шаблона их вывести:

    WP Loop
    <?php
    							$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
    							query_posts(array(
    								'post_type' => 'reviews',
    								'posts_per_page' => -1,
    								'paged' => $paged,
    							));
    						?>
    						<?php if ( have_posts() ) : ?>
    							<?php $i = 1; ?>
    							<?php while ( have_posts() ) : the_post(); ?>
    								<div class="col-lg-6">
    									<?php echo get_template_part('template-parts/content','review'); ?>
    								</div>
    								<?php $i++; ?>
    
    
    							<?php endwhile; ?>
    						<?php endif; ?>
    						<?php wp_reset_postdata(); ?>



    Так же прошу заметить, что при добавлении нового отзыва (файл newreview.php), в этом блоке кода:
    $post_data = array(
    	'post_title'    => 'Отзыв #' . uniqid(),
    	'post_content'  => $message,
    	'post_status'   => 'pending',
    	'post_author'   => 1,
      'post_type'     => 'reviews'
    );

    указано: 'post_status' => 'pending',, что означает добавление всех новых отзывов со статусом На модерации, если нужно отключить эту настройку, то поставьте 'post_status' => 'publish',
    Ответ написан
    7 комментариев
  • Как отловить null в ответе ajax?

    Во-первых, это не ответ сервера, это ошибка JS.

    Во-вторых, эта ошибка говорит: "не могу прочесть свойство predid" у null-переменной. Следовательно, result2.users у вас NULL. Проверяйте именно это условие.
    Ответ написан
    1 комментарий
  • Где купить такие векторы?

    Подобные элемент в красной рамке спокойно ищутся и свободно скачиваются на freepik.com. Например, тут. Не забудьте только почитать про лицензии.
    Ответ написан
    1 комментарий
  • Как правильно строить проект на Vue.js?

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

    2. Если у вас очень просто проект, то нет смысла создавать компонент button, в котором будет находится та же кнопка, с какими-то вашими properties. Компоненты нужны в случае, как сказано у вас, переиспользования. Например у вас компонентом может быть какой-то пост, какой-то комментарий и тд.
    Ответ написан
    Комментировать
  • Ведение внутренней переписки [с клиентом] на Laravel-сайте - существуют ли готовые типовые решения?

    Либо я не понимаю вашего вопроса, либо вы не знаете что такое гугл: запрос

    Один из первых сайтов в поиске: https://github.com/thekordy/ticketit с демками и всем чем нужно.
    Ответ написан
    1 комментарий
  • Можно/целесообразно ли делать анимированные переходы в вебе?

    Если хотите попробовать, попробуйте barba.js, с помощью него можно сделать нормальные переходы между страницами (и не надо никакие SPA делать). В качестве инструментов для анимации (если сами писать не умеете или не хотите) могу посоветовать: tweenmax и другие решения (которые найдете там же).
    Ответ написан
    1 комментарий
  • Какие инструменты использовать для продакшена Laravel + Git?

    Совсем недавно столкнулся с такой же задачей по развертыванию проекта на сервере.

    Опишу коротко как это делается. Но для начала полезная ссылка, которая поможет понять что вообще требуется делать: link. Сразу скажу что не имея вообще никакого опыта, с помощью техподдержки компании, где куплен сервере возился со всем этим около полутора дней. Поэтому, если время важно, рекомендую сразу найти человека, который за вас это сделает.

    Итак по порядку:
    1. Как уже говорили выше, сервер на Windows это не ок, только Linux.
    2. Вся установка на сервере примерно такая же как и на локальном компьютере, где вы разрабатываете.
    2.1. Сначала устанавливаете curl (который скорее всего установлен)
    2.2 Устанавливаете Composer (прописываете всего пару команд)
    2.3 Ставите Git, Node, NPM (так же ставится все в 1-2 команды)
    3. Возня с созданием пользователя, настройкой прав для работы с деплой-сервисом и тд.
    4. Установка самого деплой сервиса. Я использую deployer.
    5. Создание ssh ключей для вашего пользователя
    6. Подключение этих ключей в вашем github или bitbucket профиле.
    7. Развертывание deployer в папке и указание настроек.
    8. Собственно сам деплой.

    По ссылке выше гайд, описывающий как это делается. Дополнительно видео, которое может помочь разобраться что и как.

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

    Берете Bootstrap Tabs, пихаете эти табы в форму, на самый последний таб вешаете кнопку с отправкой формы, на все остальные табы вешаете кнопку для перехода к следующему табу (обработчик там в 2 строчки). На этом вся "необычность" заканчивается.
    Ответ написан
    Комментировать
  • Как не отправлять Notification в телеграм, если у пользователя не установлен chat_id?

    0example
    @0example Автор вопроса
    Возможно кому-нибудь, когда-нибудь пригодится. Решил проблему так:

    В созданном Notification, в методе, в котором описывается способы доставки письма, прописал следующее:

    /**
         * Get the notification's delivery channels.
         *
         * @param  mixed  $notifiable
         * @return array
         */
        public function via($notifiable)
        {
            return $notifiable->notify_settings->telegram_enabled ? ['database',TelegramChannel::class] : ['database'];
        }
    Ответ написан
    Комментировать
  • О изучении PHP и Фреймворках?

    Вам просто еще рано в фреймворки, попробуйте написать обычную авторизацию, добавление товара, вывод товара, потом добавьте рубрики товаров, выводите товары по рубрикам. Во всей той куче кода, которую вы напишете , вы начнете путаться, тогда полезете смотреть про ООП, далее проведя какое-то кол-во времени наткнетесь на паттерны, далее помучавшись с этим сможете потихоньку засматриваться на фреймворки.
    Ответ написан
    2 комментария
  • Как вы учитесь и ищете чужие исходники?

    Я начал просто искать заказы на фрилансе и брался за те вещи, которые в целом понимал как работаю, но никогда их не делал. Брал и делал, конечно я выбирал те задачи, которые в целом могут вполне работать нормально, даже если где-то наговнокодить, это были всякие запилы сайтов на вордпрессе, написать скрипт калькулятора на js и прочее.

    Так из обычной html-верстки я начал влезать в js и php одновременно, но предпочтение все же отдал js, хотя и ковыряние в вордпрессе дали некоторое понимание как работает php и как стоит писать/как не стоит.

    Далее я уже не боялся брать чуть более сложные задачи (для меня тогда), просто рылся в скриптах, которые использовал (чтобы понимать почему ЭТО работает). На том же вордпрессе стал делать более грамотные темы, писать возможности кастомизации и прочее, шаг за шагом в этом разбираетесь и все.

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

    Спустя какое-то время наслышавшись всяких ES5, React, Angular, Vue, стал просто читать что это, как это, ничерта не понял, закрыл.

    Через какое-то время уровень проектов пошел такой, что я понял смысл использования того же VUE, открыл всю ту же зеленую книгу с носорогом стал вдоль и поперек ее изучать. Спустя время, документация по vue меня нисколько не пугала, я сел и стал переписывать проект, который до этого писал на javascript + jquery.

    С тем же PHP такая же ситуация, мне просто стало интересно (а иногда и нужно), как работаю серверы, как делаются api и так далее, товарищ, работающий в подобной сфере в хорошей компании, быстро сказал в каких аспектах я дно, после того как я задал ему пару глупых вопросов. И я стал снова: читать статьи, практиковаться, исправляться, смотреть что пишут другие.

    В целом схема обучения проста: вы берете какую-то задачу, которую сходу не можете сделать, начинаете ее решать, пока решаете, возникает куча вопросов, вы ищете информацию, МНОГО ИНФОРМАЦИИ, так и учитесь. Я соглашусь, что пилить всякие todo листы наверное не интересно, попробуйте написать что-то интересное для себя, либо интересное с точки зрения: ВАУ Я МОГУ СДЕЛАТЬ ЭТУ ВЕЩЬ.

    Самое главное - не пытайтесь гнаться за всем подряд, не надо сидеть разбираться с гитхабом, если на вашем уровне профессионализма он вообще никак не задействован. Не надо учить React, Vue, Angular, если на вашем этапе профессионализма они вам не требуются. Не надо вникать в ООП, если для вас написание простых функций уже является сложностью. Делайте постепенно и не гонитесь ни за чем.
    Ответ написан
    4 комментария
  • Выполнять метод через n-интервал времени, но только после первого события?

    Создаете флаг, присваиваете ему false, при первом клике меняете его на true и запускаете интервал.

    примерно так:

    data(){
          return {
            flag: false,
          }
        },
        methods: {
          somefunc(){
                if(this.flag == false) {
                   //do something
                  //то что выполнится в первый раз
                } else {
                   setInterval(func,5000);
                   // то что будет выполняться следующие разы
                }
                this.flag = true;
                
               
            }
          },

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

    1. Храните информацию о просмотренных ID видео и времени окончания просмотра (например, закончил смотреть на 5 минуте) пользователем либо в его истории (раздел на сайте), либо в куки.
    2. Если человек прервал просмотр видео, добавляете информацию в хранилище, например:
    {
       id: 1234,
       time: '1:23'
    }

    3. При выводе новых видео, проверяете все выводимые ID с теми, что хранятся у пользователя в хранилище, проверяете условие:
    time просмотренного видео меньше time выводимого видео

    Если ответ true, то считаете какой процент занимает просмотренное пользователем время видео, до времени, когда это видео оканчивается.

    Выводите полоску с style="width: ПОЛУЧЕННЫЙ_ПРОЦЕНТ%"
    Ответ написан
  • 8гб озу, i3, 256 ssd, full hd - нормально для веб разработки?

    1. В прошлом вопросе вам уже давно ответили на все. Зачем задавать новый?
    2. Вы сомневаетесь в том, хватит ли вам 8 гб для того чтобы держать открытым какой-нибудь Atom или sublimetext? Серьезно? Этого будет более чем.
    3. Вместо вопросов берите себе уже ноутбук и начинайте учить, все равно несколько месяцев вы не будете вылазить из обычного текстового редактора.
    Ответ написан
  • Как в woocommerce сделать SMS-информирование и E-mail?

    Крепите свою функцию на хук создания нового заказа и все:
    add_action( 'woocommerce_new_order', 'create_invoice_for_wc_order',  1, 1  );
    function create_invoice_for_wc_order( $order_id ) {
        $order = new WC_Order( $order_id );
        $items = $order->get_items();
        // etc...
    }

    получаете таким образом e-mail продавца, телефон и все что угодно. Далее уже по api отправляете sms через какой-нибудь подобный сервис.
    Ответ написан
    Комментировать
  • Нормально ли подглядывать при верстке про теги?

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

    Можно привести миллион примеров из жизни, когда приходится куда-то подсматривать. Это нормально.

    Потом вы уже засмотрите эти теги так, что ночью сонным спокойно будете говорить какой тег за что отвечает, но на это нужно время.
    Ответ написан
    Комментировать
  • Где научится работать с API сайтов?

    Скорее вам нужно научиться работать с МАССИВАМИ данных, обрабатывать их так как надо.

    Апи вам отдает какие-то данные, код ответа. Следовательно вам нужно понимать какой код что значит и суметь обработать полученные данные на том ЯП, которым вы пользуетесь.

    UPD: если вам нужно еще и научиться делать запросы к API, то читайте соотв. статьи, для этого не нужно три десятка книг листать.
    Ответ написан
    Комментировать
  • Как правильно реализовать редактирование записей в бд?

    Сделайте disabled input, для него пропишите стили так, чтобы поле ввода было обычным блоком (без обводки и тд), на input вешаете обработчик дабл клика, при срабатывании убираете атрибут disabled у input. Теперь его можно редактировать.

    Если речь идет о том, как потом все это сохранять в базу, то это уже другой вопрос.
    Ответ написан
    Комментировать