Создайте свой собственный шорткод с php

Я хочу создать свой шорткод

в тексте я могу поставить шорткод например :

люди очень славны, [Гал ~ маршрут~100~100], люди очень Ницца, [ga2l~route2~150~150]

в этом выражении вы можете увидеть шорткоды в теги [ ], я хочу показать текст без этого шорткода и заменить его на галерею (с php включить и прочитать галерею пути из шорткод)

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

 <?php
 $art_sh_exp=explode("][",html_entity_decode($articulos[descripcion],ENT_QUOTES));

 for ($i=0;$i<count($art_sh_exp);$i++) {

 $a=array("[","]"); $b=array("","");

 $exp=explode("~",str_replace ($a,$b,$art_sh_exp[$i]));


 for ($x=0;$x<count($exp);$x++) { print
 "".$exp[1]."-".$exp[2]."-".$exp[3]."-<br>"; }

 } ?>

спасибо

6 ответов


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

он использует preg_match_all (документация здесь), чтобы найти все вхождения, а затем просто str_replace (документация здесь), чтобы поместить преобразованный шорткод обратно в строку

регулярное выражение, содержащееся в этом коде, просто пытается соответствовать 0 неограниченным случаям символа между скобками [ и ]

$string = "The people are very nice , [gal~route~100~100] , the people are very nice , [ga2l~route2~150~150]";
$regex = "/\[(.*?)\]/";
preg_match_all($regex, $string, $matches);

for($i = 0; $i < count($matches[1]); $i++)
{
    $match = $matches[1][$i];
    $array = explode('~', $match);
    $newValue = $array[0] . " - " . $array[1] . " - " . $array[2] . " - " . $array[3];
    $string = str_replace($matches[0][$i], $newValue, $string);
}

результирующая строка теперь

The people are very nice , gal - route - 100 - 100 , the people are very nice , ga2l - route2 - 150 - 150

путем ломать проблему в 2 участках

  • поиск всех событий
  • замена их новыми значениями

проще разрабатывать и отлаживать. Это также упрощает, если вы хотите изменить в какой-то момент, как ваши шорткоды переводятся в URL-адреса или что-то еще.

Edit: как предложил Джек, используя праздник позволит сделать это проще. Увидеть его ответ.


один из способов сделать это с помощью preg_replace_callback():

function my_replace($match)
{
    // $match[0] is e.g. "[gal~route~100~100]"
    // $match[1] is e.g. "gal~route~100~100"

    // now do whatever you want with the found match
    return join('-', explode('~', $match[1])) . '<br />';
}

// apply callback on all patterns like [*]
preg_replace_callback(
    '/\[([^]]+)\]/', 
    'my_replace',
    html_entity_decode($articulos[descripcion],ENT_QUOTES)
);

вы также можете попробовать что-то вроде этого:

$org_text = "Lorem ipsum dolor sit amet, [SHORTCODE_1] adipiscing elit.
Phasellus id orci ac dolor dapibus [SHORTCODE_1] at eu sem.
Nullam pretium bibendum urna et gravida. Donec [SHORTCODE_1] vehicula lectus
nec facilisis. Maecenas vel ante tincidunt, [SHORTCODE_2] 
sem id, tincidunt elit. Integer neque [SHORTCODE_2], ultrices in lore
[SHORTCODE_2], egestas ullamcorper enim.";

$shortcodes_a =  array('[SHORTCODE_1]','[SHORTCODE_2]');
$shortcodes_b =  array('Some text','Some other text');                   

$new_text = '';

$new_text = str_replace($shortcodes_a, $shortcodes_b, $org_text);

echo $new_text;

это даст вам:

Lorem ipsum dolor sit amet, Some text adipiscing elit. Phasellus id orci ac dolor dapibus Some text at eu sem. Nullam pretium bibendum urna et gravida. Donec Some text vehicula lectus nec facilisis. Maecenas vel ante tincidunt, Some other text sem id, tincidunt elit. Integer neque Some other text, ultrices in lorem Some other text, egestas ullamcorper enim.

Вы можете использовать регулярное выражение для сопоставления элементов внутри квадратных скобок. А потом ... --0--> строка с разделителем как ~ чтобы получить другие значения (или вы можете использовать регулярное выражение для этого тоже).

ссылки:

функции preg_match()

preg_match_all ()

код preg_replace()

хорошая ссылка для изучения регулярных выражений: http://www.regular-expressions.info/


Я видел это, и это помогло и подумал, если кто-то хотел бы знать более или менее простую версию, чтобы по крайней мере генерировать очищенную версию различных шорткодов с блоком контента. [слайд-шоу: (название слайд-шоу)] или [форма: (название формы)] (Я только настроил его до тех пор, пока слайд-шоу немного, и думал, что попытаюсь вернуть. код ниже и может быть просто скопирован в файл php и просмотрен, чтобы увидеть, что такое вывод.

<code>
//Regular expression  would be : '/\[(blah:)(.)+\]/'
// The \2 is an example of backreferencing. This tells pcre that
// it must match the second set of parentheses in the regular expression
// itself, which would be the ([\w]+) in this case. The extra backslash is
// required because the string is in double quotes.
$html = "stupid text here taht is totally lame [slideshow:topLeft] Some more dumb text [slideshow:topright] and finally some more dumb text here.";

preg_match_all('/\[(slideshow:)(.*?)\]/', $html, $matches);
$properArray = array();
$customShortCodes = array();
foreach($matches[0] as $slideKey=>$slideShow)
{
    $matchNoBrackets = str_replace(array('[',']'),'',$slideShow);
    $shortCodeExploded = explode(':', $matchNoBrackets);
$customShortCodes['slideshow'][$slideKey] = $shortCodeExploded[1];
}
$customShortCodes['form'][0] = 'contact us';
$customShortCodes['form'][1] = 'Mulch Count';
//loop through customShortCodes to replace proper values.
$newContent = $html;//assigning original content to new only for comparison testing.
foreach($customShortCodes as $shortCodeKey=>$shortCode)
{
    if($shortCodeKey == 'slideshow')
    {
        print_r($shortCode);
        foreach($shortCode as $show)
        {
            $testingReplacementText = "<strong>$show</strong>";
            $originalShortCode = "[slideshow:$show]";
            $newContent = str_replace($originalShortCode,$testingReplacementText,$newContent);
        }
    }
    if($shortCodeKey == 'form')
    {
        //print_r($shortCode);
    }
}

print_r($customShortCodes);
</code>

вывод из того, что сверху:

  • Оригинал: глупый текст здесь taht полностью хромает [слайд-шоу: topLeft] Еще один тупой текст [слайд-шоу: topright] и, наконец, еще один тупой сообщение здесь.
  • Revized: глупый текст здесь taht полностью хромает левой некоторые более стремно текст верхнем правом и, наконец, еще один тупой текст здесь.

    echo 'Original: '.$html.'
    '; echo 'Revized: '.$newContent.'
    ';

надеюсь, это поможет. Я создал это с помощью WordPress shortcodes для использования на моей собственной CMS. Реальный конечный результат будет включать использование ob_start и включая php-файлы для получения желаемого результата.

<code>
ob_start();
include "{$slideshowName}_slideshow.php";//OR pass through params to the file...
$conditionalContent = ob_get_contents();
ob_end_clean();
</code>

ваша строка заменить переменные параметра не будет принимать значения массива;

str_replace ($a,$b,$art_sh_exp[$i]) /*Here $a , $b are array values so wont work*/

попробуйте использовать метод ниже: 1. Frist попробуйте заменить строковый символ' [' 2. Затем попробуйте заменить строковый символ']'

пожалуйста, попробуйте это:

str_replace (']','',str_replace ('[','',$art_sh_exp[$i]))