пусть даже тело шорткода такое (понимаю , что такое тело не совсем можно, но суть не в этом) :
`function sert( $atts ) {
echo(«s»);
}
так вот в этом случае высветит «s» 3 раза.
сдается мне, что если этот код вы запихнете в functions.php, то сработает он только 1 раз. а значит проблема в коде плагина.
Модератор
Юрій
(@yube)
Бывает и такое. Ищите «виновника». Я лично был знаком Темой, которая провоцирует такое поведение шорткодов. Авторы не придумали ничего лучше, чем прогонять do_shortcode по контенту еще до начала вывода — для определения жабаскриптов, необходимых для работы шорткодов Темы.
Бороться с этим можно при помощи переменных типа static.
да похоже что дело либо в теме , либо в каком-нибудь другом плагине.
я запустил свой плагин на денвере — работает один раз.
поясните , что вы имели ввиду сославшись на переменные типа static ?
вот так , да ?
function sert( $atts ) {/*процедура описания шорткод*/
global $wpdb;
static $int;
if ($int==0) {
........
$int++;
return $html
}
Модератор
Юрій
(@yube)
Смотря какая задача. Если шоркод что-то невидимое выполняет, например, фиксирует просмотр статьи, то так. Если выводит что-то, сильно нагружающее сервер, то как-то так
{
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;
}
в моём коде тоже ведь в случае чего-нибудь ресурснопожирающего выполнится один раз. по мне так коды тождественны .