• Как поднять сервер на Linux и задеплоить приложение?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Здравствуйте!
    Установите apache tomcat
    https://firstvds.ru/technology/recipes/tomcat

    Соберите проект в архив. Например, в war. Залейте на сервер
    Ответ написан
    Комментировать
  • Как убрать фото из индексации wordpress?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    нужно отредактировать файл robots.txt
    если хотите убрать конкретное фото, то используйте
    User-agent: *
    Disallow: /wp-content/uploads/myphoto.png

    если нужно убрать все фотографии из библиотеки, то используйте:
    User-agent: *
    Disallow: /wp-content/uploads/*.png*
    Disallow: /wp-content/uploads/*.jpg*
    Disallow: /wp-content/uploads/*.jpeg*
    Disallow: /wp-content/uploads/*.gif*
    Disallow: /wp-content/uploads/*.tiff*
    Disallow: /wp-content/uploads/*.bmp*
    Ответ написан
    5 комментариев
  • Как углубить свои знания по теме Java EE?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Здравствуйте!
    Я и сам сейчас на любительском уровне изучаю java EE и фреймворк Spring.
    Материалов много, но если честно понимание приходит со временем. Я например, для саморазвития взял небольшой проект и работаю над реализацией в spring. Конечно же встречаются проблемы и тут уже мне помогает и литература, и тостер и stackoverflow.
    Ответ написан
  • Где редактировать последние комментарии WORDPRESS?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    Ищите шаблон comments.php в папке вашей темы.
    Для вывода даты, согласно грамматике русского языка, используйте:
    www.wordpressplugins.ru/critical/russian-date.html

    А еще не забудьте глянуть файлы перевода на наличие переводимых строк. Ищите папку languages в вашей теме, а именно файлы pot, po, mo. (не факт, что они есть). А для редактирования используйте программу PoEdit или плагин locoTranslate
    Ответ написан
  • Почему блоки наезжают друг на друга в теме wordpress?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    Это довольно известная тема от египетского разработчика (если не ошибаюсь). Он же разработал такие темы, как jarida, sahifa.
    Если быть вкратце, то суть в том, что верхний виджет обладает св-вом fixed и соответственно, при скролле накладывается на нижележащие виджеты.
    Возможные варианты решения:
    1) правильнее было бы fixed виджеты выводить после обычных виджетов. Тогда будет довольно хороший эстетический эффект.
    2) не совсем правильный метод, но можно назначить fixed виджету больший z-index. Тогда при наезжании на обычный виджет, чуть лучше будет смотреться.
    что-то типа такого:
    .theiaStickySidebar {
    z-index:9999 !important;
    background:#ffffff !important;
    }

    хотя, это не самое лучшее решение.
    3) либо просто поменять fixed виджет на обычный.

    Как по мне, самым адекватным является первый вариант.
    Ответ написан
  • Как сделать фильтр по категориям в wordpress?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    Попробуйте плагин essential grid, он выводит сетку с записями по категориям. И соответствено, при клике на категорию по аяксу он сортирует записи и есть ф-ция подгрузки новых записей по аяксу
    Ответ написан
    Комментировать
  • Фильтр цены для WooCommerce?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    Не могу поделиться ссылками на сторонние ресурсы, ибо они не хочу нарушать правила сайта Тостер, но если вы погуглите, то найдете много сайтов, где можно скачать обнуленные версии всех премиум плагинов. Есть сайт, где вы можете купить обнуленную версию плагина за 250 руб.
    А так из всех фильтров, с которыми мне доводилось работать рекомендую плагин от dzeriho
    https://codecanyon.net/item/woocommerce-product-fi...

    Ищите его nulled версию. В интернете полно
    Ответ написан
  • Возможно ли реализовать с помощью вордпресса?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    А в чем собственно говоря, заключается проблема?
    В том, как реализовать или можно ли реализовать это на ВП вообще?
    ВП это cms система и вы можете реализовать на нем все, что угодно.
    Другой вопрос как именно реализовать...
    1) Установите ВП в режиме wpms (мультисайт). Далее создайте субдомены для нужных стран: ru.example.com en.example.com. (или можно устанавливать в разные каталоги... example.com/en example.com/ru). Можно обойтись и без мультисайта.. а просто создав разные страницы с соответствующими слагами /en /ru
    2)Далее вам нужно реализовать функционал добавления карточки банка. Для этого создайте кастомный тип записи и таксономию для нее.
    3) добавьте кастомные поля для записей при помощи acf pro. Например, сумма, срок и т.д.
    4) Создайте аякс фильтрацию для "фильтрации, сортировки" записей по нужным кастомным полям.
    Готово.
    Ответ написан
    Комментировать
  • В меню wordpress нет переносов?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    Не уверен, что это сработает, но попробуйте в месте переноса добавить тег <br>
    Ответ написан
    1 комментарий
  • Не подскажете, где найти максимально дешевый VPS?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    Я использую hetzner.
    Ответ написан
    Комментировать
  • Каким плагином можно отключить скрипты на определенных страницах?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    1) как вы отметили - плагин Clearfy
    2) установите плагин query monitor. Найдите handle нужных скриптов и стилей, а далее выполните deregister_script(). Чтобы отключать на конкретных страницах используйте условные теги. Например, для главной: is_front_page()
    Ответ написан
    Комментировать
  • Как сделать такой фильтр?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    Довольно нелпохой ресурс для реализации того, что вы хотите:
    https://www.smashingmagazine.com/2016/03/advanced-...

    Возможно, что есть готовые плагины... Например, для вукомерца есть плагин для фильтрации
    https://ru.wordpress.org/plugins/woocommerce-produ...
    https://ru.wordpress.org/plugins/yith-woocommerce-...
    Ответ написан
    Комментировать
  • Как добавить класс к ссылке, на которую перешел?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    Если вы используете кастомное меню без ВП и РНР, то обрабатывать добавление класса надо на клиентской стороне. Соответственно, нужно написать js скрипт.
    Ответ написан
    Комментировать
  • Какой функцией Wordpress проверяет существование пользоаттеля?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    Вы можете использовать условные теги ВП для проверки юзера.
    Например:
    email_exists( $email )
    username_exists( $username )
    https://codex.wordpress.org/Conditional_Tags#Email...
    Ответ написан
    Комментировать
  • Как написать Android приложение?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Здравствуйте!
    intellij idea конечно хорошо, но если хотите без лишней головной боли, то используйте android studio. Он как раз использует ядро intellij idea community edition.

    Что касается разработки, то я использовал видеокурсы:
    https://startandroid.ru/ru/
    https://devcolibri.com/

    Можете также посмотреть курсы на udemy.com || stepik.org
    Ответ написан
    2 комментария
  • Как создать опции для кастомного поста?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    1) Создаете нужную таксономию для рубрик и кастомный тип записи для записей.
    2) Далее установите плагин ACF Pro и создайте шаблон и группу полей с нужными вам полями для кастомного типа записи.
    3) Используйте acf_form() для того, чтобы вывести форму на сайте.
    При отправке формы записи будут попадать в админку (можно настроить статус, чтобы они публиковались со статусом "черновик"). Также можно добавить wpmail() чтобы получать уведомления при наличии новой заявки.
    https://www.advancedcustomfields.com/resources/usi...
    https://www.advancedcustomfields.com/resources/acf...
    Ответ написан
    Комментировать
  • Woocommerce: Как создать боковое меню навигации с товарами?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    По сути вам нужно вывести 2 цикла. (цикл в цикле). Первый цикл будет получать термины таксономии (категории), а второй цикл будет получать товары для этой таксономии.
    Например, если нужно вывести рубрики и все их товары, то можно использовать следующий код:
    https://gist.github.com/DevinWalker/6fb2783c05b46a...

    https://stackoverflow.com/questions/1780386/loopin...

    Адаптируйте код под себя.
    Ответ написан
    1 комментарий
  • Как оптимизировать мой код по выводу zip файлов на страницы wordpress?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    Вас беспокоит, что zip архивы будут скапливаться или то, что файлы, которые были добавлены в архив не удаляются из библиотеки?
    Один из моих знакомых разработчиков написал небольшой скрипт для возможности на стороне сервера создавать архивы в библиотеке из выбранных файлов. И если мне память не изменяет, то там есть возможность удаления файлов, которые были включены в архив.

    Вот код:
    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>";
    }


    Что касается cron, то тут можно поступить по разному. Можно использовать wp cron, а можно использовать cron. И конечно же это по сути скрипт, который нужно периодически запускать.
    Ответ написан
    Комментировать
  • Advanced Custom Fields. Как сделать что бы значение полей заданные на одной кастомной странице, отображались и на других без их повторного ввода?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    С учетом того, что футер, хедер и сайдбар являются "общими" областями, то логичнее было бы использовать acf_option.
    Создать пункт меню "Параметры темы" и выводить настройки в нужных местах через the_field || get_field добавляя 'option'

    А так, конечно же можно просто передать ID страница для которой вы выбрали отображение кастомных полей. Т.е. если вы загружаете их на главной, то в кастомные поля передайте id главной и соответственно, они будут доступны для других страниц
    Ответ написан
    Комментировать
  • LMDE, как добавить новое разрешение экрана и как загрузить его?

    azerphoenix
    @azerphoenix Автор вопроса
    Java Software Engineer
    Удалось решить вопрос следующим образом:
    Источник:
    https://community.linuxmint.com/tutorial/view/877

    Для lmde3 Cinnamon:
    в консоли:
    xrandr --newmode "1600x900_60.00" 118.25 1600 1696 1856 2112 900 903 908 934 -hsync +vsync
    xrandr --addmode eDP-1 "1600x900_60.00"


    Далее alt + ctrl + F1
    sudo service lightdm stop
    sudo X -configure 
    sudo start lightdm


    далее в инструкции говорится, что файл xorg.conf.new созается в /home
    у меня он создался в /root

    Надо переименовать его в xorg.conf
    Открыть и отредактировать добавив в него:
    Section "Monitor"
            Identifier   "Monitor0"
            Modeline     "1600x900_60.00"  118.25  1600 1696 1856 2112  900 903 908 934 -hsync +vsync
            VendorName   "Monitor Vendor"
            ModelName    "Monitor Model"
    EndSection
    
    Section "Monitor"
            Identifier   "Monitor1"
            Modeline     "1600x900_60.00"  118.25  1600 1696 1856 2112  900 903 908 934 -hsync +vsync
            VendorName   "Monitor Vendor"
            ModelName    "Monitor Model"
    EndSection

    Section "Screen"
        Identifier "Screen0"
        Device     "Card0"
        Monitor    "Monitor0"
        SubSection "Display"
                   Viewport   0 0
                   Depth     1
                   Modes   "1600x900"
        EndSubSection
        SubSection "Display"
                    Viewport   0 0
                    Depth     4
                    Modes   "1600x900"
        EndSubSection
        SubSection "Display"
                     Viewport   0 0
                     Depth     8
                     Modes   "1600x900"
        EndSubSection


    Кол-во мониторов может быть разным.

    После чего нужно сохранить и добавить этот файл в /etc/X11
    Перезагрузить систему и все
    Ответ написан