01. Проблемы и решения с WordPress

Что-то не работает? Сайт не загружается? Сломалось. Пиши сюда.

Настроить обновление теми

Всем привет

Есть несколько сайтов на одной самописной теме. Возник вопрос, как можно проще распостранять новие изменения в теме на все сайти. 

Возможно ли обновлять тему не с wordpress.org, а с собственного ресурса?  И как вообще настроить обновление теми? 

Как изменить содержание произвольной записи после создания

Я создаю произвольную запись при помощи wp_insert_post()
Как мне сразу же после создания изменить его содеожимое?

Дополнительный функционал для WooCommerce

Добрый день!

После безуспешных попыток найти исполнителя прошу помощи у специалистов-программистов, специализирующихся на WP.

Есть тема мульти-вендорная Dokan, на ее базе есть сайт – фотосток для фотографов-любителей. 

Требуется написать для сайта функционал со следующими требованиями:
1.Возможность создания товаров загрузкой изображений в галерею

2.Выбор шаблона товара (Будут созданы несколько шаблонов – разница в ценах. Шаблоны не видны в магазине, не видны в товарах продавца, наверное со статусом “на рассмотрении”)

3.Все товары создаются со статусом «на рассмотрение» администратором. Я буду их потом согласовывать. В Докан по умолчанию так и работает.

4.При создании товаров нужно предусмотреть ввод меток товаров (на каждый товар в отдельном блоке

5.При создании товаров нужно предусмотреть выбор категории

6.При создании товаров автоматически создаются миниатюры заданных размеров для скачивания. Ссылки на миниатюры автоматически прописываются в полях соответствующих вариаций.

7.Как создаются миниатюры: по максимальной ширине (высоте). Например WEB 800 px – бОльшая сторона уменьшается до 800 пикселей. Оригинал это оригинал.

8.Превью на сайте создается с водяным знаком – логотип сайта и Имя автора. 

Насколько это реализуемо? Какой для этого нужно предусмотреть бюджет? Есть ли какие-то ограничения в написании такого кода? Если вам есть что предложить, можете написать мне на 401592@gmail.comСпасибо!

Отображение анонсов записей в три колонки

Здравствуйте! Я использовал на сайте следующую конструкцию для отображения анонсов записей в две колонки:

<?php
<div align="left" style="padding:0 20px;">
              <?php if (have_posts()) { 
                query_posts('cat=1');
                $i = 0;
                $per_column = ceil($posts_per_page / 2);
                if ($wp_query->post_count <= $posts_per_page)
                  $per_column = ceil($wp_query->post_count / 2); 
        ?> 
        <div class="column"> 
        <?php while (have_posts()) { 
                the_post(); 
                $i++;
        ?> 
        <div class="thumbnail">
          <?php the_post_thumbnail('thumbnail');?>
        </div>
            <div class="clear"></div>
              <div class="post"> 
                  <a href="<?php the_permalink(); ?>" rel="bookmark"><?php the_title(); ?></a>
<?php the_time('d.m.Y'); ?>
                  <?php the_content('ПОДРОБНЕЕ &raquo;'); ?>
                </div><!-- .post --> 
 
        <?php if ($i == $per_column) { ?> 
              </div><!-- .column --> 
     
            
            <div class="column right"> 
        <?php }
            }
          } 
        ?> 
 
          </div><!-- .column --> 
 
          <div class="clear"></div> 
      </div>
  
  </div>
?>

В настоящий момент возникла необходимость расположить анонсы новостей в три колонки, но, к сожалению, моих крайне скромных познаний в PHP не хватает на то, чтобы это самостоятельно сделать.

Невозможность входа на страницу авторизации WordPress

Установил ВордПресс . Решил перейти на страницу авторизации по ссылке “http://ws-kursy.ru/wp-login.php” на своем ноутбуке но получил страницу где было написано, что страница не найдена. На смартфоне все хорошо! 
Что я пробовал сделать: менял провайдера интернета, менял браузеры и отключал брандмауэр. Все это не помогло, как не появлялась страница авторизации  так и не появилась на ноутбуке. Помогите ! Я уже ни чего не могу понять почему ьтакая неоднозначность. На смартфоне я могу войти на страницу авторизации, а на ноутбуке нет! Может у кого-то было такое. Спасибо за помощ. 

Фильтр записей на wordpress

Есть разметка под фильтр записей по категориям. Все бы хорошо, но он сверстан дивами, собственно, как можно реализовать передачу данных о постах на сервер для обработки без использования form и input? Подойдут ли data- атрибуты для этого дела? Или все же переделывать на checkbox?есть вот такой код “Попытка затолкнуть данные о категории в data”

<?php
<div class="center-filter__categories">
    <?php if($terms = get_terms(('category'))) { ?>
        <?php foreach($terms as $term) : ?>
            <?php echo "<div class='center-filter__categories-item center-filter__item' data-id='".$term->term_id."'>".$term->name."</div>"; ?>
        <?php endforeach; ?>
    <?php } ?>
</div>
?>

не понимаю как обработать data

cherry-wizard

Подскажите кто знает выдает ошибку, не могу установить((

Сортировка изображений

Доброго времени суток форумчане сделал плагин на основе коде найденного в просторах тернета который дает возможность добавлять в записи дополнительные фото, появилась необходимость сортировать картинки в заданном порядке для этого добавил переменную $gallery_data[‘image_count’] но как сортировать по ней не могу придумать, может подскажете в какую сторону копать

<?php
add_action( 'admin_init', 'add_post_gallery_so_14445904' );
add_action( 'add_meta_boxes_page', 'add_page_gallery_so_14445904' );
add_action( 'admin_head-post.php', 'print_scripts_so_14445904' );
add_action( 'admin_head-post-new.php', 'print_scripts_so_14445904' );
add_action( 'save_post', 'update_post_gallery_so_14445904', 10, 2 );



/**
 * Add custom Meta Box
 */

// Add meta box to custom posts 
function add_post_gallery_so_14445904() 
{
         
    add_meta_box(
        'post_gallery',
        'Галерея для Tixon',
        'post_gallery_options_so_14445904',
         'post',
        'normal',
        'core'
    );
}



/**
 * Print the Meta Box content
 */
function post_gallery_options_so_14445904() 
{
    global $post;
    $gallery_data = get_post_meta( $post->ID, 'gallery_data', true );

    // Use nonce for verification
    wp_nonce_field( plugin_basename( __FILE__ ), 'noncename_so_14445904' );

    ?>
<?php echo 'Количество элементов > ', count( $gallery_data['image_url'] );?>
    
    <div id="dynamic_form">

        <div id="field_wrap">
        <?php 

        if ( isset( $gallery_data['image_url'] ) ) 
        {
            for( $i = 0; $i < count( $gallery_data['image_url'] ); $i++ ) 
            {
         
            ?>

            <div class="field_row">

              <div class="field_left">
                <div class="form_field">
                  <!--<label>Image URL</label>-->
                  <input type="hidden"
                         class="meta_image_url"
                         name="gallery[image_url][]"
                         value="<?php esc_html_e( $gallery_data['image_url'][$i] ); ?>"
                  />
                  <input type="hidden"
                         class="meta_image_id"
                         name="gallery[image_id][]"
                         value="<?php esc_html_e( $gallery_data['image_id'][$i] ); ?>"
                  />
                </div>
                <div class="form_field" style="margin-bottom: 20px">
                  <label>Описание изображения</label>
                  <textarea
                         class="meta_image_desc"
                         name="gallery[image_desc][]"
                         rows="1"
                         style="width: 100%"><?php esc_html_e( $gallery_data['image_desc'][$i] ); ?></textarea>
                </div>
                       <div class="form_field" style="margin-bottom: 20px">
                  <label>Ссылка на Youtube видео</label>
                  <textarea
                         class="meta_image_desc"
                         name="gallery[href_url][]"
                         rows="1"
                         style="width: 100%"><?php esc_html_e( $gallery_data['href_url'][$i] ); ?></textarea>
                </div>

                <input class="button" type="button" value="Выбрать изображение" onclick="add_image(this)" />&nbsp;&nbsp;&nbsp;
                <input class="button" type="button" value="Удалить" onclick="remove_field(this)" />
              </div>

              <div class="field_right image_wrap">
                <img src="<?php esc_html_e( $gallery_data['image_url'][$i] ); ?>" />
          <input type="text" size="10" class="meta_image_count" name="gallery[image_count][]" value="<?php esc_html_e( $gallery_data['image_count'][$i] );  ?>">
              </div>
              <div class="clear" /></div> 
            </div>
            <?php
            } // endif
        } // endforeach
        ?>
        </div>

        <div style="display:none" id="master-row">
        <div class="field_row">
            <div class="field_left">
                <div class="form_field">
                    <!--<label>Image URL</label>-->
                    <input class="meta_image_url" value=""  name="gallery[image_url][]" />
                    <input class="meta_image_id" value=""  name="gallery[image_id][]" />
                </div>
                <div class="form_field" style="margin-bottom: 20px">
                    <label>Описание изображения</label>
                    <textarea class="meta_image_desc" name="gallery[image_desc][]" rows="3" style="width: 100%"></textarea>
                </div>
                    <div class="form_field" style="margin-bottom: 20px">
                    <label>Ссылка на Youtube видео</label>
                    <textarea class="meta_image_href_url" name="gallery[href_url][]" rows="3" style="width: 100%"></textarea>
                </div>
                <input type="button" class="button" value="Выбрать изображение" onclick="add_image(this)" />&nbsp;&nbsp;&nbsp;
                <input class="button" type="button" value="Удалить" onclick="remove_field(this)" />
            </div>
            <div class="field_right image_wrap">

            <input type="text" size="10" class="meta_image_count" name="gallery[image_count][]" value="">
            </div>
            <div class="clear"></div>
        </div>
        </div>

        <div id="add_field_row">
          <input class="button" type="button" value="Добавить доплнительное поле" onclick="add_field_row();" />
        </div>
        <?php if ( 'trend' == get_post_type( $post->ID ) ) { ?>
        <p style="color: #a00;">Make sure the number if images you add is a <b>multiple of 5</b>.</p>
        <?php } ?>
    </div>
    <?php
}

/**
 * Print styles and scripts
 */
function print_scripts_so_14445904()
{
    // Check for correct post_type
     global $post;
    if( 'post' != $post->post_type )
        return;
    ?>  
    <style type="text/css">
      .field_left {
        float:left;
        width: 85%;
        padding-right: 20px;
        box-sizing:border-box;  
      }
      .field_right {
        float:left;
        width: 15%;
      }
      .image_wrap img {
          max-width: 100%;
          max-height: 200px;
      }
      #dynamic_form input[type=text] {
        width:100%;
      }
      #dynamic_form .field_row {
        border:1px solid #cecece;
        margin-bottom:10px;
        padding:10px;
      }
      #dynamic_form label {
        display: block;
        margin-bottom: 5px;
      }
    </style>

    <script type="text/javascript">
        function add_image(obj) {

            var parent=jQuery(obj).parent().parent('div.field_row');
            var inputField = jQuery(parent).find("input.meta_image_url");
            var inputFieldID = jQuery(parent).find("input.meta_image_id");
            var fileFrame = wp.media.frames.file_frame = wp.media({
                multiple: false
            });
            fileFrame.on('select', function() {
                var selection = fileFrame.state().get('selection').first().toJSON();
                inputField.val(selection.url);
                inputFieldID.val(selection.id);
                jQuery(parent)
                .find("div.image_wrap")
                .html('<img src="'+selection.url+'" />');
            });
            fileFrame.open();
        //});
        };

        function remove_field(obj) {
            var parent=jQuery(obj).parent().parent();
            parent.remove();
        }

         function add_field_row() {
            var row = jQuery('#master-row').html();
            jQuery(row).appendTo('#field_wrap');
        }
    </script>
    <?php
}

/**
 * Save post action, process fields
 */
function update_post_gallery_so_14445904( $post_id, $post_object ) 
{
    // Doing revision, exit earlier **can be removed**
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )  
        return;

    // Doing revision, exit earlier
    if ( 'revision' == $post_object->post_type )
        return;

    // Verify authenticity
    if ( !wp_verify_nonce( $_POST['noncename_so_14445904'], plugin_basename( __FILE__ ) ) )
        return;

  if ( 'post' != $_POST['post_type'] ) 
        return;

    if ( $_POST['gallery'] ) 
    {
        // Build array for saving post meta
        $gallery_data = array();
        for ($i = 0; $i < count( $_POST['gallery']['image_url'] ); $i++ ) 
        {
            if ( '' != $_POST['gallery']['image_url'][ $i ] ) 
            {
                $gallery_data['image_url'][]  = $_POST['gallery']['image_url'][ $i ];
                $gallery_data['image_id'][]  = $_POST['gallery']['image_id'][ $i ];
                $gallery_data['image_desc'][] = $_POST['gallery']['image_desc'][ $i ];
                  $gallery_data['href_url'][] = $_POST['gallery']['href_url'][ $i ];
                    $gallery_data['image_count'][] = $_POST['gallery']['image_count'][ $i ];
            }
        }

        if ( $gallery_data ) 
            update_post_meta( $post_id, 'gallery_data', $gallery_data );
        else 
            delete_post_meta( $post_id, 'gallery_data' );
    } 
    // Nothing received, all fields are empty, delete option
    else 
    {
        delete_post_meta( $post_id, 'gallery_data' );
    }
}
?>

Удалить, добавить пост не заходя в админку

Здравствуйте!
Вопрос.
1. Есть список названий постов. Возле каждого названия есть кнопка ”

Удалить”. При клике по кнопке соответствующий пост удаляется без захода в админку, а сразу (пользователь зарегистрированный);
2. При нажатии на кнопку, которая находится на фронт  енде, выпадает поп ап, в котором пользователь указывает название статьи и может при желании еще загрузить pdf файл. При нажатии на кнопку submit  этого попап, на сайте создается запись с указанным названием, а загруженный файл загружается в медиа библиотеку. После этих двух действий в содержимое вновь созданной записи вставляется шорт код в котором используется ссылка на медиа файл PDF, который загрузился в предыдущем шаге.

Подскажите в общих чертах как можно реализовать такой функционал на бекенд.

Мультиязычный сайт с плагином Elementor

Здравствуйте, возникла такая проблема: нужно сделать мультиязычный сайт, но популярные плагины не устанавливаются, либо работают некорректно. Машинный перевод не устраивает, нужен либо чисто ручной, либо машинный с возможностью редактировать. Плюс весь сайт создавался на Elementor, что тоже создает определенные неудобства. Возможно, кто-то сталкивался с подобной проблемой и уже знает, как она решается. В любом случае, заранее спасибо за ответ. 

Сайт, где выставить sidebar id, WordPress

Добрый день, имею сайт abso-lute.ru, при выставлении в движке своей старой темы, (нужной) дебуг говорит чтоб проблем с сайдбаром. Нужно выставить id сайдбара а вот где его выставить незнаю, помогите в беде.

Поиск из среды WP по базе данных

Допустим в phpMyAdmin будет создана таблица данных из 150 человек(Фамилия, Имя, Отчество, и т.д.). На определенной странцы сайта WordPress будет форма поиска по этой таблице. Как это проще реализовать. Будьте любезны, подскажите. Обшарил пол интернета. Что-то похожее есть, но моими руками не заработало.

Пункт в меню WP

Здравствуйте. Хочу сделать лимит на количество символов в одном пункте в меню или желательно иметь возможность перенести на строку ниже после определённого символа(надо после дефиса). Пишу длинное название пункта, но вместо того, чтоб перенестись на строку ниже, оно просто заполняет строку в длину, т.к. есть место. Заказчик просит этот пункт в 2 строки, а я не понимаю, как это сделать. Пересмотрел десятки форумов и нигде не нашёл именно этой проблемы. Прошу помощи, скрин прилагаю. Первый скрин-как есть, второй-как надо(он из выпадающего меню, там всё автоматом переносится)

Ищу готовое решение для небольшого сайта с отзывами

Всем доброго времени суток. Есть идея сделать тематический (только одна категория товаров) сайт отзывов о товарах и продавцах. Чтобы товары и продавцов мог добавлять только я, а пользователи писали отзывы и ставили оценки. И чтобы в итоге можно было сортировать товары и продавцов по рейтингам и другим критериям (цена для товаров, город для продавцов и т.д.). Ну и чтобы защита от накрутки какая-то была. Есть какое-то более-менее готовое решение? У меня есть небольшой опыт работы с wordpress, интернет-магазины делал и сайты обычные. Что посоветуете?

title и мета в пользовательском посттайпе

Ребята, всем привет! Сделал пользовательский посттайп для портфолио по созданию сайтов. Отдельные посты в этом посттайпе это страницы с кейсом об одном определённом сайте. Они сделаны в рамках админки постами. Им можно прописать тайтлы, дескрипшны, текст и т. п., то есть средствами админки это сдлеать можно. А вот с самим посттайпом, как рубрикой для кейсов сайтов — проблема. Все метаданные формируются каким-то внутренним шаблоном. В БД ничего не нашёл, да и вряд-ли он там что-то есть, так как видно, что title складывается из нескольких частей. Контент получается можно редактировать только через файл шаблона посттайпа в папке темы. Пробовал менять метаданные через фильтры, но ничего не получилось. В YoastSeo тоже ничего не нахожу. А всё это поменять очень надо, так как это страница для портфолио по созданию сайтов, а таких запросов хватает, плюс хочется порядка, чтобы лишних мусорных страниц не образовывалось. Подскажите, может кто сталкивался с подобным, есть ли какое-то толковое решение. Заранее спасибо!

Вот проблемная страница: https://insodatech.by/blog/portfolioweb/

Первое изображение в качестве миниатюры

Добрый день народ!Известно, что open graph выводит картинку, которую при создании записи назначено в качестве миниатюры, но можно его заставить вывести картинку в том случае, если миниатуры не задано, то есть добавляем функцию для og где будет присутствовать кусок кода

//ДЛЯ ИЗОБРАЖЕНИЙ
$first_img = '';
$otimg = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches);
$first_img = $matches [1][0];
if(empty($first_img)){
$first_img = get_bloginfo('template_directory'). '/wp-content/uploads/2019/11/rianovost.ru_.jpg';
}

И после этого при шаринге в соцсетях open graph выводит картинку, которая задана в качестве миниатюры, а если миниатуры нет, то благодаря коду выше выводит первое изображение записи если даже это изображение находится вне хостинга, то есть выставлен из других сайтов.Теперь мой вопрос в следующем :Известно, что можно настроить вывод похожих записей без плагина если вставить код в нужное место


<div class="poxojie_zapisi">
<?php
$categories = get_the_category($post->ID);
if ($categories) {
$category_ids = array();
foreach($categories as $individual_category) $category_ids[] = $individual_category->term_id;
$args=array(
'category__in' => $category_ids,
'post__not_in' => array($post->ID),
'showposts'=>5,
'orderby'=>rand,
'caller_get_posts'=>1);
$my_query = new wp_query($args);
if( $my_query->have_posts() ) {
echo '<h3>Похожие записи:</h3>';
echo '<ul>';
while ($my_query->have_posts()) {
$my_query->the_post();
?>

<li><a>" rel="bookmark" title="<?php the_title(); ?>">
<?php the_post_thumbnail(); ?><br /><?php the_title(); ?></a></li>
<?php
}
echo '</ul>';
}
wp_reset_query();
}
?>
</div>

РазвернутьНо этот код выводит только те изображения, которые заданы в качестве миниатуры во время создания записи.Мой вопрос к программистам :Как первый код от open graph интегрировать в коде вывода похожих записей, что как в open graph выводил первое изображение записи если даже миниатуры не заданы.То же самое касается вывода первой картинки на главной в анонсах. Тут вообще странное дело получается. Если в записи не вставить тег далее, то на главной выводится анонсы с изображением только из тех записей, где задана миниатуры, а записи без заданных миниатюр выводятся голым текстом, но как только вставлю в записи тег далее, то на главной выводятся первые изображения записи, словно тег далее подталкивает изображения на главной.Кто нибудь знает как быть с этим багом?Тема GeneratePressТема поддерживает вывод краткого анонса вне зависимости вставлен ли в записи тег далее, например в других темах если не вставить тег далее, то на главной выводит запись целиком, но у меня вывод анонса не зависит от тега. Но зато вывод изображении почему то зависит от тега далее.

Аккордеон для фильтра товаров

Добрый день.Подскажите, пжлст, как можно решить следующую задачу:Установил фильтр товаров для Woocommerce — Premmerce Product Filter. Очень нужен именно этот плагин. Но есть один нюанс — он не имеет возможности сворачиваться в аккордеон на мобильном виде.Не могу использовать никакой код аккордеона, чтобы в него вставить фильтр шорткодом, так как плагин не имеет шорткода. Он добавляется виджетом в сайдбар.Подозреваю, что единственное решение — в каком-то шаблоне, где выводится сайдбар «Shop» можно прописать какой-то html-код аккордеона. Но не знаю, где это делать и что вписывать.Буду признателен за помощь.Спасибо!

Возможно ли запретить прямой доступ к корневым файлам WP?

Здравствуйте!
Подскажите пожалуйста, существует ли способ без использования плагинов запретить прямой доступ к файлам ядра WP, к примеру:http://localhost/wp-admin/user/menu.php
http://localhost/wp-settings.php
http://localhost/wp-links-opml.php
http://localhost/wp-mail.php
И подобные файлы, которые выдают информацию с ошибками, при прямом доступе. Есть файлы, которые версию движка отображают или к примеру относительные пути.
Пробовал перекрывать таким образом:
RedirectMatch Permanent http://oursense.ru/wp-mail.php /
но в это случае перестает работать отправка писем.
Можно ли как то запретить к подобным файлам прямой доступ или просто переадресовывать на 404?

Как вывести номер страницы пагинации в заголовке h1 Woocommerce?

Добрый день.Появилась потребность уникализировать заголовки h1 страниц пагинации в категориях Woocommerce. Требуется начиная со 2 страницы дописывать к заголовку – “Страница 2 из N”” и т.д. (на первой/главной странице категории выводится оригинальный h1 без указания номера страницы ). Подскажите как это можно максимально грамотно и просто реализовать. Находил в интернете, что-то похожее на решение моей задачи. но реализовать не смог. Если подскажите на примере шаблона Astra, буду максимально признателен.Заранее благодарю!

Меняется адрес при отправке формы в http://site-ru/wp-comments-post.php

Форма:

<?php
<form action="/wp-comments-post.php" method="post">
<input  name="fio" type="text" value="">
<input name="submit" type="submit" value="Отправить">
</form>
?>

При нажатии на отправить осуществляется переход на адрес http://site-ru/%5ehttp://127.0.0.1/$
Откуда это %5ehttp://127.0.0.1/$ берется?

В Chrome инструменте разработчика видно, что происходит 301 редирект, но кто его делает?
При отправке формы в любой другой файл-обработчик адрес не меняется.
На хостинге также происходит замена адреса, где вместо 127.0.0.1 подставляется мой ip.
Перелопатил все: код, бд, htaccess – не нашел никаких редиректов

Если переименовать wp-comments-post.php в wp-comments-post111.php, то отправка происходит без смены адреса, т.е. все работает как и должно. Ну вот как так-то?

Anonymous
Отправить
Ответ на: