• Решено Andrey

    (@ifromussr)


    Приветствую! Сразу скажу, что php я знаю плохо. Вернее сказать не знаю, но понимаю т.к. занимаюсь прикладным программированием.

    Постановка задачи: необходимо сделать страницу с галереей с помощью своего шаблона. В этом шаблоне стоит фильтр на посты, который выводит только те, что имеют метаданные ‘imageurl’. Отображается с помощью такого кода:
    <a href="<?php echo get_permalink() ?>"> <img src="<?php echo get_post_meta($post->ID, 'imageurl', true);?>" width="190px" style="border: 2px #CFCFCF solid;"></a>
    Отсюда видно, что ссылку на миниатюру хранит metadata «imageurl»

    При редактировании публикации можно изменить metadata «imageurl» с помощью стандартной формы, но для удобства я написал форму (в файле functions.php) в которую вставляется ссылка на миниатюру.

    Выглядит она так:
    http://airphotos.ru/wp-content/uploads/2010/12/add.jpg

    Для обновления metadata используется следующий код (functions.php):

    add_action('save_post', 'metasave');
    
    function metasave() {
        global $post;
    	if ($_POST[imageurl]!='') update_post_meta($post->ID, 'imageurl', $_POST[imageurl]); else delete_post_meta($post->ID, 'imageurl');
    }

    Проблема в следующем: после успешного добавления поста в галерею спустя некоторое время он оттуда пропадает. Точную закономерность действий приводящих к этому последствию я установить не могу, но как правило это происходит при редактировании другого поста не содержащему ссылку в галерею. Очевидно, что срабатывает условие delete_post_meta. В functions.php эта функция встречается только в приведенном выше коде.
    Мне совершенно не понятно почему при редактировании одной публикации изменяются метаданные в другой. Никак не понятно.
    Объясните мне, пожалуйста, как решить эту проблему. Спасибо!

Просмотр 2 ответов — с 1 по 2 (всего 2)
  • Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    1. Получать ID записи надёжнее непосредственно из параметров save_post.
    2. Можно также модифицировать функцию, убрав delete_post_meta():
      add_action('save_post', 'metasave');
      
      function metasave($post_id) {
      	if (isset($_POST['imageurl']) update_post_meta($post_id, 'imageurl', esc_html($_POST['imageurl']));
    3. Чтобы пустые значения не выводились в шаблоне, можно написать так:
      <?php $imageurl = get_post_meta($post->ID, 'imageurl', true); ?>
      <?php if ( !empty($imageurl) ) : ?>
      <a href="<?php echo get_permalink() ?>"> <img src="<?php echo $imageurl;?>" width="190px" style="border: 2px #CFCFCF solid;"></a>
      <?php endif; ?>

    Спасибо!
    Теперь более менее понятно. В моем случае если при сохранении поста метадата imageurl не существует, то в этом случае и выполняется else, то есть удаляется ссылка, но из другой публикации.
    То есть мне надо было просто использовать isset:)
    Надеюсь, что этот баг больше не вылезет:)

Просмотр 2 ответов — с 1 по 2 (всего 2)
  • Тема «Проблема с созданием галереи» закрыта для новых ответов.