Поддержка Проблемы и решения wp-шный shortcode выполняется несколько раз ?

  • написал несложный плагин для wp.
    в самом конце прописал shortcode:

    function sert( $atts ) {
    /*ничего особенного*/
    }
    
    add_shortcode( 'sertificate_link','sert' );

    а на странице просто тупо делаю так :

    [sertificate_link id=22]

    так вот выясняется , что процедура shortcode отрабатывается аш 3 раза. А хотелось бы один .

Просмотр 10 ответов — с 1 по 10 (всего 10)
  • пусть даже тело шорткода такое (понимаю , что такое тело не совсем можно, но суть не в этом) :

    `function sert( $atts ) {
    echo(«s»);
    }

    так вот в этом случае высветит «s» 3 раза.

    сдается мне, что если этот код вы запихнете в functions.php, то сработает он только 1 раз. а значит проблема в коде плагина.

    Бывает и такое. Ищите «виновника». Я лично был знаком Темой, которая провоцирует такое поведение шорткодов. Авторы не придумали ничего лучше, чем прогонять do_shortcode по контенту еще до начала вывода — для определения жабаскриптов, необходимых для работы шорткодов Темы.

    Бороться с этим можно при помощи переменных типа static.

    да похоже что дело либо в теме , либо в каком-нибудь другом плагине.
    я запустил свой плагин на денвере — работает один раз.

    поясните , что вы имели ввиду сославшись на переменные типа static ?

    вот так , да ?

    
    function sert( $atts ) {/*процедура описания шорткод*/
    global $wpdb;
     static $int;   
    if ($int==0) {
    ........
    $int++;
    return $html
    }
    

    Смотря какая задача. Если шоркод что-то невидимое выполняет, например, фиксирует просмотр статьи, то так. Если выводит что-то, сильно нагружающее сервер, то как-то так

    
    {
    static $html;
    if ( $html ) return $html;
    $html = ....
    return $html;
    }
    

    если играют параметры, то их тоже надо учесть при сохранении.

    А если шорткод делает что-то очень простое, например, возвращает текущее время, то вообще не стоит этим заморачиваться.

    шорткод сначала выводит input text в котором пользователь вводит имя/фамилия, а затем берёт картинку из медии и зарисовывает на нем это имя / фамилию . и даёт скачать картинку.

    
    function sert( $atts ) {
    global $wpdb;
     static $int;   
    if ($int==0) {
    //echo("_file_=".__FILE__.'|<br>');
    	$params = shortcode_atts( array( 
    		'id'=> 0
    	), $atts );
    
    $string = $params['id'];
    
    $doc = new DOMDocument(); 
    $doc->loadHTML($string);    
    // echo($string);
    
    foreach ($doc->getElementsByTagName('img') as $node) {
    
    $src = $node->getAttribute( 'src' );
     
    }
    
    $src = WP_CONTENT_DIR.'/'.substr($src,strpos($src, 'uploads'),strlen($src) );
    
    $html='<h1 class="entry-title">Пожалуйста, введите своё имя и фамилию на английском языке</h1><form action="'.get_permalink( $post->ID ).'" method="post"><input type="text" name="NAME"><input style="margin-left: 12px;" type="submit" name="OK"></form>';
    if (isset($_POST['NAME'])) {
    
    /*****************************************************************/
    /*процесс наложения подписи*/
    
    $ttfImg = new ttfTextOnImage(str_replace (chr(92),'/',$src));
    //echo($src);
    $size=35;
    
    $text = mb_convert_encoding($_POST['NAME'], 'UTF-8', 'CP-1251');
    $text = strtoupper($text);
    $ttfImg->setFont($text,str_replace (chr(92),'/',WP_PLUGIN_DIR."/certificate_downloader/assets/fonts/librebaskerville.ttf"), 35, "#123C0E", 10000);      
    
    $ttfImg->writeText(300, 300, $text) ;
    
    $uniqid = uniqid("").'.jpg';
    $uniq_id_url=WP_PLUGIN_URL.'/certificate_downloader/'.$uniqid ;
    //echo("1".'<br>');
    $pic_dir = str_replace (chr(92),'/',WP_PLUGIN_DIR.'/certificate_downloader/'.$uniqid );
    $ttfImg->output($pic_dir);
    
    /*****************************************************************/
    
    $html='<h1 class="entry-title">Готово, теперь можете скачать свой сертификат</h1> <a href="'.$uniq_id_url.'" Download> Скачать</a>';
    
    }
    $int++;
    	return $html;
    }
    }
    
    

    у меня работает с моим вариантом. но принимаю критику )

    не понял ваше «Если выводит что-то, сильно нагружающее сервер, то как-то так»:

    
    {
    static $html;
    if ( $html ) return $html;
    $html = ....
    return $html;
    }
    

    в моём коде тоже ведь в случае чего-нибудь ресурснопожирающего выполнится один раз. по мне так коды тождественны .

Просмотр 10 ответов — с 1 по 10 (всего 10)
  • Тема «wp-шный shortcode выполняется несколько раз ?» закрыта для новых ответов.