Задать вопрос
  • Как оптимизировать мой код по выводу 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
    Перезагрузить систему и все
    Ответ написан
  • Как исключить строка меню из цикла?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    для ответа на ваш вопрос, недостаточно информации...
    что подразумевается под "строкой меню". Код, который вы предоставили всего лишь стандартный цикл ВП, который выведет title & content.
    Ответ написан
  • Как грамотно перести сайт на английскую версию?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    Лично я использую WPML и именно он доставил мне меньше хлопот. С PolyLang не знаком близко... А вот, плагины qtranslate, qtranslate-X & WPGlobus заставили напрячься) Постоянно баги, проблемы и т.д.(((
    Ответ написан
    Комментировать
  • Использовать ли в проектах elementor wordpress?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    Темы продающиеся на themeforest в 80-90% случаев используют различные визуальные редакторы. Будь то elementor, но в основном часто встречается WpBakery Visual Composer. Также для продажи темы желательно прикрутить какой-нибудь фреймворк, а-ля Redux Framework.

    Использовать ли виз. редакторы в Ваших личных проектах, решать сугубо вам. Я например, не люблю редакторы и юзаю кастомные поля (плагин ACF или фреймворк Carbon FIelds). Если пишете проект для клиента, то можно использовать виз. редакторы, чтобы они каждый раз вас не дергали в случае, если понадобится что-то добавить или удалить.
    Ответ написан
    Комментировать
  • Как переименовать оригинальное слово?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    [en_US:]text[:en_US][ru_RU:]Текст[:ru_RU]
    Это вероятнее всего шорткод для какого-то плагина. Могу сказать точно, что не для wpml & не для qtranslateX. Возможно, polylang
    __('Text','tem')
    исходя из этого кода, могу сказать, что эта строка подготовлена для перевода и для нее используется textdomain "tem'. Соответственно, ищите языковые файлы po mo pot с названием tem-.*
    Ну и скажите при помощи чего у вас реализована мультиязычность на сайте
    Ответ написан
  • Медленная загрузка сайта на вордпресс?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    1) установите плагин p3 profiler и посомтрите, сколько памяти требуется для работы плагинов и сколько реально у вас выделено. Если что, увеличьте лимит хостинга. upload_max_filesize memory_limit max_execution_time max_post_size и т.д.
    2) заменили ли вы ссылки на сайт после переноса в БД? Если нет, то плагин better search replace.
    3) открывайте консоль браузера, вкладка сеть и смотрите что именно тормозит работу сайта.
    Ответ написан
    1 комментарий
  • Как добавить в цикл название выбранного категории?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    Соглашусь с Игорем Воротнёвым насчет всего, что он вам написал.
    Честно, говоря не совсем понял, что именно вы хотите.
    1) вы хотите вывести название рубрики (категории) в цикле?
    2) вы хотите вывести записи из конкретной категории?
    3) вы хотите вывести цикл со всеми категориями и записями к ним?

    Ответы:
    Информация по WP_Query
    https://wp-kama.ru/function/wp_query

    - Если вы хотите вывести записи из конкретной категории, то вместо post_type используйте tax_query, как и отметил мой коллега. post_type используется для задания типа записи post, page, "custom_post_type".

    Пример цикла с использованием tax_query
    https://wp-kama.ru/function/wp_query#parametry-tak...

    - Если вы хотите вывести все рубрики и записи к ним, то надо исопльзовать 2 вложенных цикла. Первый выводит термины таксономии, а второй выводит записи
    Пример реализации:
    https://gist.github.com/azerphoenix/a8c82ffdee27e1...
    https://stackoverflow.com/questions/1780386/loopin...
    Ответ написан
    1 комментарий
  • Как подключить css последним (wordpress)?

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

    Ссылка на полезные источники -
    https://stackoverflow.com/questions/7896536/orderi...
    https://www.reddit.com/r/Wordpress/comments/35lr2t...

    Попробуйте эти варианты
    Ответ написан
    Комментировать
  • Как реализовать сайт с публикацией и скачиванием файлов?

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

    Без реализации контроля версии я могу посоветовать плагин Use Your Drive. Вы загружаете файлы на гугл диск. (по умолчанию диск объемом 15 гб). А дальше уже привязываете папку к конкретной странице и пользователи могут просматривать и скачивать файлы. Вопрос с контролем версии можно решить. разве что созданием папки для каждого файла. Например, Файл1 - версия 1, версия 2, версия 3 и т.д.
    Пример работы скрипта:
    md7.info/books

    Второй вариант также простой... Используйте плагин ACF Pro.
    Создайте кастомный тип записи "Файлы". Создайте повторитель для него, а вовнутрь повторителя вложите тип поля "Файлы" и тип поля "Текст" (для указания версии) файла.
    Ответ написан
    Комментировать
  • Как настроить 301 редирект с верхнего на нижний регистр в WordPress?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Полезная статья по вашей теме -
    https://www.goinflow.com/redirect-uppercase-urls-t...
    А вот решение из этой статьи -
    https://brianflove.com/2014/08/11/lowercase-your-uris/

    Тут уже вопрос - есть ли у вас доступ к httpd конфиг файлу. Если шаред хостинг, то скорее всего нет
    Ответ написан
    Комментировать
  • Как элегантно преобразовать String в Calendar?

    azerphoenix
    @azerphoenix Куратор тега Java
    Java Software Engineer
    Что-то типа такого подойдет? https://stackoverflow.com/questions/5301226/conver...
    Ответ написан
    Комментировать
  • Как создать сайт для фитнес центра? Wordpress?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Любая тема, которая вам доступна. Желательно премиум тема с themeforest с визуальным редактором visual composer, elementor и т.д., чтобы вам меньше пришлось кодить.
    Можно даже взять divi, kleo, apress и другие
    Ответ написан
    2 комментария
  • ACF повторитель не работает адекватно?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    1) исключите баг плагина
    2) вы создаете поле внутри повторителя или вне него?
    3) перетащите созданное поле внутрь повторителя
    Ответ написан
  • Анти-спам для формы WP?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Здравствуйте!
    1) Плагин Akismet. Нужно получить бесплатный апи ключ. Как раз защищает от СПАМа. Довольно неплохо.
    2) Google Recaptcha v2, Invisible или V3. Правда, плагинов для V3 на сегодняшний день (09.12.18) нет.
    3) Плагин CleanTalk. Защищает очень хорошо. Месяц бесплатно, а через месяц примерно 550 руб. в год за один сайт. Если можете себе позволить, то рекомендую
    Ответ написан
    Комментировать
  • Как редактировать это поле в woocommerce( выделено красным)?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Поищите в переводах вукомерца или вашей темы. Ищите папку languages (в случае с вукомерцем ищите i18n) и вы найдете po mo pot файлы. Отредактируйте po файл, сохраните, как mo и залейте обратно.
    Программа для редактирования PoEdit
    Плагин - LocoTranslate
    Ответ написан
    Комментировать
  • Spring - почему возникает исключение ConversionFailedException?

    azerphoenix
    @azerphoenix Автор вопроса, куратор тега Java
    Java Software Engineer
    Решение оказалось довольно простым:
    - Нужно было убрать Revision revisionNew
    - в теле метода создать новую ревизию и сохранить

    Revision revisionNew = new Revision(revision);
    revisionService.addRevision(revisionNew);
    Ответ написан
    Комментировать
  • Как сделать виртуальные страницы?

    azerphoenix
    @azerphoenix
    Java Software Engineer
    Я конечно не знаю цели, которую вы хотите этим достичь, но можно сделать следующее (возможно, что и не самое лучшее решение):
    1)
    - создать таксономию с алфавитом: a, b, c, d etc. Для удобства массового создания рубрик можете использовать BulkPress
    - Создать записи для каждой из таксономии...
    2)
    - создать кастомный тип записи и в слаг прописать a, b, c, d.

    А далее уже кастомизировать соответствующий шаблон вашей темы.
    Ответ написан
    Комментировать