Поддержка Проблемы и решения Двойной вызов функции

  • Здравствуйте
    Возникла проблема, может кто знает решение?
    В файл functions.php вставляю такой код:

    function notestzakrww(){
    $dfgdfg=array(1,2,3);
    $headers = 'From: Test.ru <ottest@test.ru>' . "\r\n";
    $i=0;
    foreach ($dfgdfg as $ids => $objkt) {
    sleep(5);
    wp_mail('tutest@test.com', 'Title '.$i, 'Message '.$i, $headers);
    $i++;
    }
    }
    add_action('init', 'notestzakrww',100,0);

    Код работает но, вместо 3х e-mail отсылает 6.
    Что только не делал, плагины отключены, пробовал на разных хостингах и т.д.
    Получается функция вызывается не 1 а 2 раза.
    Если кто знает решение поделитесь.

Просмотр 10 ответов — с 16 по 25 (всего 25)
  • Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    1. Проверил в WordPress 3.0.1, 3.0.2 и 3.0.3 на Денвере сразу после установки. Во всех трёх случаях высылаются три письма.
    2. Проверил на тестовой установке 3.0.3 с несколькими плагинами — высылается шесть писем. Результаты debug_backtrace() показывают два типа вызовов: через index.php (обычные) и через wp-admin/admin-ajax.php.
    3. Как ещё один вариант, можно использовать более позднее действие — например, wp или template_redirect — вместо init.
    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    и дефолтной чистой теме

    get_the_post_thumbnail($post->ID,array(120,120));

    Строго говоря, именно такой строки в ней нет 🙂 Хотя есть похожая. Возможно, используется режим Multisite? Там для отдачи загруженных изображений подключается wp-load.php.

    Проверил с

    wp или template_redirect

    Тоже самое
    Получается там где есть вызов get_the_post_thumbnail или the_post_thumbnail идет повторный вызов.
    Странное поведение.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Если не используется режим Multisite и файл изображения существует, то он должен выдаваться средствами сервера, без участия PHP и WordPress.

    Да, если файл миниатюры существует то get_the_post_thumbnail нормально работает. Но если не существует, то к WP идет двойной вызов.
    Проверил только что.
    А есть мысли как подвить двойной вызов если файл минатюры отсутствует на сервере но назначен в посте?

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Пара предположений:

    1. Обернуть вызов в has_post_thumbnail():
      <?php
      if ( has_post_thumbnail( $post->ID ) ) :
      	echo get_the_post_thumbnail( $post->ID, array( 120, 120 ) );
      endif;
      ?>
    2. Добавить ещё и проверку на существование файла:
      <?php
      if ( has_post_thumbnail( $post->ID ) ) :
      	$thumbnail = get_the_post_thumbnail( $post->ID, array( 120, 120 ) );
      	preg_match('/src="(.*?)"/', $thumbnail, $matches);
      	if ( !empty($matches) ) {
      		$thumbnail_file = str_replace( get_option('home') . '/', ABSPATH, $matches[1] );
      		if ( file_exists($thumbnail_file) )
      			echo $thumbnail;
      	}
      endif;
      ?>

    Спасибо Сергей.
    has_post_thumbnail( $post->ID ) подключено.
    Да, проверку на существование файла стоит делать.
    Но кажется проблема не в самом get_the_post_thumbnail а в том что если есть хоть какойто еррор то идет двойной вызов.
    Возможно как доказательство ваш тест:

    Проверил на тестовой установке 3.0.3 с несколькими плагинами — высылается шесть писем.

    Нужно проверить.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Ситуация, когда в качестве миниатюры указан несуществующий файл, представляется мне нештатной. Зачем контролировать в этом случае количество вызовов, остаётся для меня загадкой.

    Нужно проверить.

    Там использовался AJAX.

    Зачем контролировать в этом случае количество вызовов, остаётся для меня загадкой.

    Проблема в том что файл миниатюры может быть физически удален с сервера, или потерян, случайно. Например при переносе с хостинга на хостинг. Если много страниц в сайте отследить очень сложно.
    Для меня загадка почему при отсутствии файла миниатюры происходит второй вызов в ВП. На странице где выводится битая миниатюра AJAX нет.

    Модератор Yuri

    (@yube)

    Для меня загадка почему при отсутствии файла миниатюры происходит второй вызов в ВП.

    Думается мне, что это 404.

Просмотр 10 ответов — с 16 по 25 (всего 25)
  • Тема «Двойной вызов функции» закрыта для новых ответов.