• Как сделать поиск по тексту c сортировкой spring mongodb?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    А почему бы вам не использовать Hibernate Search или ElasticSearch? Если я правильно понял задачу...
    Там есть и сортировка и фильтрация и много чего другого...
    Ответ написан
  • Как обновить Wordpress на 000webhost?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    здравствуйте!
    https://codex.wordpress.org/%D0%A7%D0%90%D0%92%D0%...
    добавьте в wp-config.php
    define('FS_METHOD', 'direct');

    Причина этой ошибки -
    - некооректный chmod для директории ВП
    - другой владелец апач и директории ВП
    - некорректные данные фтп
    Ответ написан
  • Почему если в TinyMCE выделить часть абзаца и выбрать Абзац, то WP виснет?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    не должно быть такого...
    - Обновите ВП
    - Обновите тему
    - Обновите плагины
    - Поочередно отключайте плагины для устранения возможного конфликта и проверяйте
    - Смените тему и проверьте

    и вообще, не должен никакой запрос убегать... у вас почему-то убегает запрос куда-то и соответственно, вы видите то, что на скрине... Также гляньте в консоли браузера (вкладка Сеть - Network) куда при клике убегает запрос.
    Ответ написан
  • Spring Как создать сложную Rest ссылку?

    azerphoenix
    @azerphoenix Куратор тега Spring
    Java Software Engineer
    А зачем вы хотите передавать данные в PathVariable? Особенно, с учетом того, что pathvariable обязателен. Получается, что вам нужно будет перебрать все возможные комбинации pathvariable.
    Как по мне, лучше просто использовать один url и в контроллере обрабатывать не pathvariable, а requestParam (required = false). А соответственно, передавать все что нужно в body POST'ом.
    Если я правильно понял вашу задачу...
    Только наверное, стоит при надобности, реализовать получение токена для авторизации и в заголовке передавать bearer token....
    Тут скорее вам виднее, как лучше реализовать)))

    Ну и для удобства используйте postman
    Ответ написан
    6 комментариев
  • Не работает EntityManager?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Здравствуйте!
    Начните с правки этого?
    Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

    Тут написано, что драйвер com.mysql.jdbc.Driver, который вы вставили в application.properties устрарел.
    Используйте вместо него com.mysql.cj.jdbc.Driver
    Это появляется в последних версиях Spring Boot при использовании БД мускула
    Ответ написан
    4 комментария
  • Как создать мультимагазин на WordPress?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    А вот, это пробовали?
    https://woomultistore.com/
    Ответ написан
    Комментировать
  • Как добавить class li элементам в меню wordpress?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    'add_li_class' => 'menu-item menu-blog',
    где вы такой аргумент увидели?

    https://wp-kama.ru/function/wp_nav_menu
    почитайте про walker
    https://codex.wordpress.org/Class_Reference/Walker

    Вот, еще одна полезная ссылка - https://stackoverflow.com/questions/14464505/how-t...
    Ответ написан
    Комментировать
  • Почему не могу сохранить в вордпрессе в редакторе страницу?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    У вас случайно плагин Clearfy не установлен? Там есть ф-ция отключения WP REST API
    Если установлен, то проверьте настройки и отключите эту функцию. Для корректной работы редактора gutenberg нужен rest api
    Ответ написан
    Комментировать
  • Как принимать оплаты на PayPal через сайт на WordPress?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!

    Если мне память не изменяет, то для возможности принимать оплату paypal вам нужно иметь бизнес аккаунт. (обычный аккаунт не подойдет).

    Дальше стоит учесть следующим момент - какого рода оплату вы хотите принимать. Например, если вы продаете товар или услугу, то наверняка используете плагин Woocommerce. Соответственно, наберите в гугл Woocommerce Paypal Payment Gateway и найдете кучу плагинов. Установите и проверьте. Также обычно, требуется ввод токена и т.д.
    Вот, пример -
    https://ru.wordpress.org/plugins/woocommerce-paypa...
    https://woocommerce.com/products/woocommerce-gatew...

    Если у вас не интернет-магазин, то стоит посмотреть на плагины, которые умеют выставлять счет на имя пользователя для оплаты услуги.
    Вот, пример - https://wordpress.org/plugins/invoicing/

    Ну а если у вас какая-то узкоспециализированная задача, то возможно, стоит заказать разработку плагина (платежного шлюза PayPal)
    Ответ написан
    Комментировать
  • Как это реализовано?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    Начнем с простого...
    1) у вас должны быть базовые знания по html, css, js, php, wordpress codex. Если у вас нет этих базовых знаний, то бесполезно дальше читать.

    Идем дальше...
    2) если вы хотите один в один сделать, то что на сайте, то как вариант можете проинспектировать блок и стянуть стили и скрипты.
    Для этого откройте консоль браузера (shift + ctrl + C) и найдите нужный в блок в DOM. Скопируйте структуру блока и стили.
    3) Можно самому вручную сверстать подобный блок
    4) Можно найти подобный блок в виде готового сниппета. Например, если у вас тема на бутстрапе, то можете посмотреть тут:
    https://bootsnipp.com/
    5) только после того, как вы сверстаете блок в html, css, js, стоит интегрировать его в ВП тему.
    По скрину это вывод новостей, а значит, вам нужно взять цикл ВП и интегрировать его в вашу верстку.
    Ответ написан
    Комментировать
  • Как сделать архив из прикрепленных к посту файлов (ACF repeater)?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    Знакомый написал небольшой рнр скрипт, который при выборе файлов из библиотеки ВП и по нажатию кнопки "Создать архив" формирует архив zip и загружает в библиотеку. Можете под себя переделать его.
    Дрбавить в functions.php
    add_action("pre-plupload-upload-ui", "appendZipWrapper2UploadUI");
    add_action("wp_ajax_createZIP", "createZipArchive");
    add_action("wp_ajax_nopriv_createZIP", "createZipArchive");
    
    function createZipArchive()
    { 
      global $wpdb; 
      $wpdb->show_errors();
    
      $isRemoveSrcNedded = true;
    
      $postTable = $wpdb->get_blog_prefix()."posts";
      $fileList = json_decode(preg_replace("#\\\\\"#", "\"", $_POST["fileList"]), true);  
    
      $parentPostID = get_posts
      (
        array
        (
          "post_type" => "attachment",
          "include" => $fileList[0] 
        )
      )[0]->post_parent;  
    
      $sqlQuery = "SELECT guid FROM ".$postTable." WHERE id IN (".implode(", ", $fileList).")";
      
      $queryResult = $wpdb->get_results($sqlQuery);
    
      $zipFileName = 
        "/tdoc".(new DateTime("", new DateTimeZone("Europe/Minsk")))->format("_Ymd_His").".zip";
       
      $path2Archive = wp_upload_dir()["path"].$zipFileName;
    
      $zip = new ZipArchive();
      $zip->open($path2Archive, ZipArchive::CREATE);  
      
      foreach($queryResult as $row)
      {   
        $path2File = $_SERVER["DOCUMENT_ROOT"].wp_make_link_relative($row->guid);   
        if(file_exists($path2File))
        {     
          $zip->addFile($path2File, basename($path2File));
        }
      }
    
      $result = $zip->close();
    
      $filetype = wp_check_filetype(basename($path2Archive), null);
      $wp_upload_dir = wp_upload_dir();
      $attachment = array(
        'guid'           => $wp_upload_dir['url'] . '/' . basename($path2Archive), 
        'post_mime_type' => $filetype['type'],
        'post_title'     => preg_replace( '/\.[^.]+$/', '', basename($path2Archive)),
        'post_content'   => '',
        'post_status'    => 'inherit'
      );
      $attach_id = wp_insert_attachment($attachment, $path2Archive, $parentPostID);
      $attach_data = wp_generate_attachment_metadata($attach_id, $path2Archive);
      wp_update_attachment_metadata($attach_id, $attach_data);
    
      if($isRemoveSrcNedded)
      {
        foreach($fileList as $currentAttacment)
        {
          wp_delete_attachment(intval($currentAttacment));          
        } 
        // file_put_contents(__DIR__."/item2del.txt", json_encode())
      }
    
      echo json_encode(["status" => $result, "filename" => basename($path2Archive)]);
      die();
    }
    
    function appendZipWrapper2UploadUI() 
    {
        // if(!current_user_can("upload_files")){return}; 
      echo "
      <style>
      #waitImage
      {
        position: fixed;
        left: calc(50% - 64px);
        width: 128px;
        height: 16px;
        background-image: url(".get_template_directory_uri()."/images/waitImage.gif);
        top: calc(50% - 7px);
        z-index: 999999999999;
        display: none;
      }
      </style>
      <script>
      var zipManagerWrapper = '<button ' +
        'id=\"createZipBundle\" ' + 
        'style=\"margin-top:11px;margin-right:10px;width:100%;padding-left:2px;padding-right:2px;}\"' +
        'class=\"button button-primary\">Архивировать</button>' +
        '<div id=\"waitImage\"></div>',
        captionWrapper = document.querySelectorAll('.media-frame .media-toolbar:nth-child(1) .media-toolbar-secondary'),
        MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver,
        contentObserver = new MutationObserver(function(mutations)
        {
          mutations.forEach(function(mutation)
          { 
            if((mutation.type == 'childList') && (mutation.addedNodes.length != 0))
            {
              mutation.addedNodes.forEach(function(nodeItem)
              {
                if(nodeItem.childNodes)
                {
                  nodeItem.childNodes.forEach(function(childItem)
                  {
                    if((childItem.nodeName == 'DIV') && (childItem.innerText.trim() == archiveName))
                    {
                      // console.log(nodeItem.dataset.id);  
                      waitImage.style.display = 'none';
                      contentObserver.disconnect();
                      jQuery('li[data-id=\"' + nodeItem.dataset.id + '\"] .thumbnail').trigger('click');
                    }
                  });
                }         
              });       
            }     
          });
        }),
        observerOption = {childList: true, characterData: true, subtree: true, attributes: true};
      var waitImage,
        archiveName;
      
      if(captionWrapper.length == 1)
      { 
        var isItemExists = 
          document.querySelectorAll('#createZipBundle').length == 0 ? false : true;
        if(!isItemExists) 
        {
          captionWrapper[0].innerHTML = zipManagerWrapper + captionWrapper[0].innerHTML;    
          waitImage = document.getElementById('waitImage'); 
          jQuery('#createZipBundle').unbind();
          jQuery('#createZipBundle').bind('click', createZipBundleHandle);
        }   
      } 
    
      function createZipBundleHandle(event) 
      {
        event.preventDefault();
        var files2Zip = Array.prototype.filter.call
        (         
          captionWrapper[0].parentElement.parentElement
            .previousElementSibling.querySelectorAll('li'),
          function(item)
          {
            return /selected/.test(item.classList.value);
          }
        ).map
        (
          function(item)
          {       
            return item.dataset.id;
          }
        );
        console.log(JSON.stringify(files2Zip));
    
        if(files2Zip.length > 0)
        {
          waitImage.style.display = 'block';
          jQuery.ajax
          ({
            url: ajaxurl,
            method: 'POST',
            data:
            {
              action: 'createZIP',
              fileList: JSON.stringify(files2Zip)
            },
            success: function(data){console.log('Ответ от сервера');displayResult(data);},
            error: function(error)
            {
              waitImage.style.display = 'none';
              console.log('Что-то пошло не так');
              console.log(error);
            }
          });
        }     
      }
      
      function displayResult(data)
      {
        var target = document.querySelectorAll('.media-modal.-select .media-modal-content .media-frame-content .attachments-browser ul')[0];
    
        data = JSON.parse(data);
        archiveName = data.filename;
        
        contentObserver.observe(target, observerOption);
        // jQuery('#media-attachment-date-filters').trigger('change')
        wp.media.frame.state().get('library').props.set({ignore: (+ new Date())});
      }
      </script>";
    }


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

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    Если выберете WordPress, то для интеграции с 1С столкнетесь с этим:
    https://www.imagecms.net/1s-moysklad-woocommerce
    стоимость 99$. Нужно будет интегрировать 1С с Woocomemrce + этот плагин

    большинство других решений по интеграции 1С уже устарели
    Ответ написан
    Комментировать
  • Можно ли писать плагины под wordpress на c++ или java?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    ВП написан на рнр, АПИ разработки плагина для ВП поддерживается на рнр и соответственно, плагины тоже нужно писать на рнр.

    Что касается java, то вы можете взаимодействовать с ВП используя WP REST API Java client. При этом в нем сейчас многое реализовано.
    https://github.com/Afrozaar/wp-api-v2-client-java
    НО! это не имеет отношения к разработке плагинов. На c++ тоже наверное, что-нибудь найдется...

    Т.е. вы можете написать некий функционал и интегрировать его через WP REST API.
    Ответ написан
    1 комментарий
  • Как в thymeleaf дублировать поле для сравнения?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Здравствуйте!
    Вы сильно заморочились, если честно... тут даже Spring ни причем, а больше базовые знания html + js
    Вот, ваша форма:
    <form th:action="@{/register}"
          th:object="${personForm}" method="POST">
        Login:
        <input type="text" th:field="*{name}" />
        <br/>
        Email:
        <input type="text" th:field="*{email}" />
        <br/>
        Password:
        <input type="text" th:field="*{password}">
        <br/>
        Confirm password:
        <input type="text" th:field="*{doublePassword}">
        <input type="submit" value="Create" />
    </form>


    1) небольшой совет используйте специфические инпуты. Например, если вам нужно поле майл, то используйте майл и т.д.
    Соответственно:
    <form th:action="@{/register}"
          th:object="${personForm}" method="POST">
        Login:
        <input type="text" th:field="*{name}" />
        <br/>
        Email:
        <input type="email" th:field="*{email}" />
        <br/>
        Password:
        <input type="password" th:field="*{password}">
        <br/>
        Confirm password:
        <input type="password">
        <input type="submit" value="Create" />
    </form>

    2) Определитесь с тем, где именно вы хотите валидировать совпадение пароля на клиенте или на сервере. Как по мне, на клиенте лучше, чтобы лищний раз не нагружать сервер.
    Если на клиенте, то средствами js, если на сервере, то средствами java. Рассмотрим оба варианта:
    - На сервере. Получаете оба пароля из формы, сравниваете через equals() и возвращаете нужный результат. Если пароль неверен, то можете добавить сообщение через model.addAttribute() и вывести в шаблоне
    @RequestMapping(value = {"/register"} , method = RequestMethod.POST)
    public String savePerson(Model model, @ModelAttribute("personForm") UserForm personForm) {
    
    
    	if(!personForm.getPassword.equals(personForm.getPasswordConfirmation)) {
    		model.addAttribute("passwordIncorrect", "Вы ввели некорректный пароль");
    		return "register";
    	}
    
        if(personForm.checkPassword() &&
                userRepository.findByEmail(personForm.getEmail()) == null &&
                userRepository.findByName(personForm.getName()) == null) {
    
            AppUser user = new AppUser(personForm.getName(),
                    personForm.getEmail(),
                    personForm.getPassword());
    
            user.setEnabled(true);
            user.setRoles(Collections.singleton(Role.USER));
            userRepository.save(user);
            return "home";
         }
    
        return "register";
    }


    - Обработка на клиенте средствами js. Идея заключается в том, что вы деактивируете кнопку "Регистрация" и только если пароли совпадают, то активируете кнопку.

    Тут материалов хватает. Наберите в гугл jquery password validation.
    Вот, пример:
    Скрипт - https://www.jqueryscript.net/form/Password-Strengt...
    Демо - https://www.jqueryscript.net/demo/Password-Strengt...
    Ответ написан
    1 комментарий
  • Есть ли плагины личных блогов для пользователей на ВордПресс?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Просто переведите ВП в режим мультисайта и получие аналог wordpress.com
    Ответ написан
    Комментировать
  • Почему WordPress отдает циклический редирект?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    1) конфигурация сервера apache, nginx, apache + nginx
    2) смотрите сам файл htaccess
    3) может какой-то плагин добавляет редирект
    4) проверьте обновили ли вы урлы в БД
    5) раньше сайт лежал в корне, а теперь, в субдиректории. Прочитайте:
    https://wordpress.org/support/article/giving-wordp...
    https://www.wpbeginner.com/wp-tutorials/how-to-ins...
    https://www.youtube.com/watch?v=inokGZeemUw
    Ответ написан
    Комментировать
  • В чем проблема с аутентификацией через Spring?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    С учетом того, что есть готовое видео, которое один в один совпадает с вашим кодом и методом аутентификации через jdbcAuthentication() , то рекомендую посмотреть:
    https://www.youtube.com/watch?v=WDlifgLS8iQ
    и даже можете один в один воспроизвести у себя.

    Что касается вашего кода, то:
    1) добавьте в application.properties
    logging.level.org.springframework.security=DEBUG
    
    logging.level.org.hibernate.SQL=DEBUG
    logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
    logging.level.org.hibernate.type=TRACE


    и увидите нужный вам стек ошибок, в частости:
    2019-05-25 20:20:12.446 DEBUG 21154 --- [nio-8080-exec-2] o.s.s.p.JdbcUserDetailsManager           : Query returned no results for user ''
    2019-05-25 20:20:12.450 DEBUG 21154 --- [nio-8080-exec-2] o.s.s.a.dao.DaoAuthenticationProvider    : User '' not found
    org.springframework.security.authentication.BadCredentialsException: Bad credentials


    Причина кроится здесь: WebsecurityConfig
    .formLogin()
                    .loginPage("/login")
                    .usernameParameter("name")
                    .passwordParameter("password")

    Вы просто забыли указать usernameParameter & passwordParameter и соответственно, Spring Security ищет в БД пользователя с именем ' '

    5ce96d384bcd4860471431.png
    Ответ написан
    5 комментариев
  • Как перенаправить пользователя на его страницу если он снова хочет залогиниться в Spring Boot?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Здравствуйте!
    Все довольно просто.
    1) можно показывать кнопку login только неавторизованным пользователям.
    В thymeleaf подключите spring security thymeleaf extras, а дальше проверяйте по
    https://www.thymeleaf.org/doc/articles/springsecur... (Глава 4)
    <div sec:authorize="isAnonymous()">
    <!-- login button here for non logged-in users -->
    </div>


    Но если вы все же хотите показывать кнопку и редиректить пользователя в его личный кабиент по нажатию кнопки login, в случае, если он уже авторизован, то:

    В методе, который возвращает /login (в контроллере) сделайте проверку:

    if(
            SecurityContextHolder.getContext().getAuthentication() != null &&
            SecurityContextHolder.getContext().getAuthentication().isAuthenticated() &&
            !(SecurityContextHolder.getContext().getAuthentication() instanceof AnonymousAuthenticationToken)
    
        ) {
    
          return "redirect:/home";
        }
    Ответ написан
    6 комментариев
  • Не работают статьи определенной рубрики WP?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    Подозреваю, что у вас кэш в браузере...
    При переходе по вышеуказанной ссылке, а затем по записям, все прекрасно работает.
    Вывод - у вас закэшированная страница в браузере
    Ответ написан
    Комментировать
  • Как в шаблоне wordpress отразить свой mail?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    https://wp-kama.ru/function/get_option
    В частности:
    <?php echo get_option("admin_email"); ?>
    Если нужно в виде ссылки, то:
    <a href="mailto:<?php echo get_option("admin_email"); ?>"><?php echo get_option("admin_email"); ?></a>
    Ответ написан
    1 комментарий