Как создать функцию WordPress в стиле шорткода в PHP - PullRequest
6 голосов
/ 31 декабря 2010

Я пытаюсь создать функцию WordPress в стиле шорткода в PHP, чтобы заменить шорткоды типа "[[133]]" изображениями. По сути, у меня есть таблица MySQL URL-адресов / заголовков / субтитров изображений с идентификаторами 1-150, и я хочу иметь возможность динамически вставлять их в текст моих страниц с помощью таких коротких кодов:

Блабла бла бла бла бла. [[5]] Кроме того, бла-бла-бла-бла-бла [[27]] Эй, и бла-бла-бла! [[129]]

Итак, я просто хочу получить идентификатор как $ id, а затем передать его в запрос MySQL, например mysql_query («ВЫБЕРИТЕ заголовок, подзаголовок, URL ИЗ изображений, ГДЕ id = $ id») а затем замените «[[id]]» на img / title / subtitle. Я хотел бы иметь возможность сделать это несколько раз на одной странице.

Я знаю, что это должно включать регулярное выражение и некоторую комбинацию preg_match, preg_replace, strstr, strpos, substr ... но я не знаю, с чего начать и какие функции мне следует использовать для каких целей. Можете ли вы порекомендовать стратегию? Мне не нужен сам код - просто зная, что использовать, для каких частей было бы чрезвычайно полезно.

Ответы [ 5 ]

7 голосов
/ 08 сентября 2014

Если вы хотите иметь возможность писать шорткоды наподобие этого:

[[function_name_suffix parameter1 parameter2 ...]]

вот более полный способ, используя preg_replace_callback и call_user_func_array для реализации параметризованных шорткодов.

function shortcodify($string){
    return preg_replace_callback('#\[\[(.*?)\]\]#', function ($matches) {
        $whitespace_explode = explode(" ", $matches[1]);
        $fnName = 'shortcode_'.array_shift($whitespace_explode);
        return function_exists($fnName) ? call_user_func_array($fnName,$whitespace_explode) : $matches[0];
    }, $string);
}

Если эта функция определена:

function shortcode_name($firstname="",$lastname=""){
    return "<span class='firstname'>".$firstname."</span>&nbsp;<span class='lastname'>".$lastname."</span>";
}

Тогда этот вызов

print shortcodify("My name is [[name armel larcier]]");

выдаст:

My name is <span class='firstname'>armel</span>&nbsp;<span class='lastname'>larcier</span>

Это просто то, что я реализовал прямо сейчасосновано на идее супертруэ.

Любые отзывы приветствуются.

4 голосов
/ 04 января 2011

С функцией getimage($id), которая выполняет запрос MySQL и форматирует текст замены, эта почти делает все, что вам нужно:

$text = "Blabla [[5]] and [[111]] bla bla bla [[27]] and bla bla bla! [[129]]";

$zpreg = preg_match_all('#\[\[(\d{1,3})\]\]#', $text, $matches );

var_dump( $matches[1] );  

$newtext = preg_replace('#\[\[(\d{1,3})\]\]#', getimage($matches[1][?????]), $text);

echo $newtext;

Мне просто нужно выяснить, что поместить внутрь getimage() (где находится ?????), что заставит его вставить правильное изображение для правильного [[id]].

См. preg_match_all и preg_replace в официальной документации для получения более подробной информации.

1 голос
/ 31 декабря 2010

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

Возьмите предложение "Hello [34] world"

Создайте простую функцию, например replaceCode ($ string)

function replaceCode($string){

    $pos = strpos($string, '['); // Find the first occurrence of the bracket

    if($pos != false){

          // If everything is ok take the next 2 numbers from it

          // Check for a close bracket & remove ]

          // call another function to replace the number with the image text

    }




}

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

Примечание. Может потребоваться проверкасделано первым, чтобы убедиться, что [и] правильно сбалансированы!

0 голосов
/ 18 января 2017

Моя ставка Функция PHP strtr ...

<code><?php
function get_profile_image($image_url){
    return "<img src='{$image_url}' height='200px' width='200px' />";
}

$trans = array(
    "[[1]]" => "Vishal",
    "[[2]]" => "Kumar",
    "[[3]]" => "Sahu",
    "[[4]]" => "Web Designer",
    "[[5]]" => "Draw and Paint",
    "[[6]]" => ucwords("any programming language"),
    "[[7]]" => strtoupper("PHP, JAVASCRIPT and HTML"),
    "[[8]]" => get_profile_image("http://php.net/images/logos/php-logo.svg"),
    "[[9]]" => "http://php.net/images/logos/php-logo.svg"
    );
$str = <<<HEREDOC_1
[[8]]
<pre>My name is [[1]] [[2]] [[3]].
I am a [[4]] and I love to [[5]].
I don't know [[6]] but I know [[7]] little bit.
Вот изображение моего профиля[[1]] - [[2]] - [[3]] - [[4]]HEREDOC_1;echo strtr ($ str, $ trans);

это вывод

[http://php.net/images/logos/php-logo.svg] Меня зовут Вишал Кумар Саху.Я веб-дизайнер, и я люблю рисовать и рисовать.Я не знаю ни одного языка программирования, но немного знаю PHP, JAVASCRIPT и HTML.Вот мое изображение профиля [Vishal-Kumar-Sahu-Web Designer]

Работает нормально на 5.6.

0 голосов
/ 31 декабря 2010

Регулярное выражение, я полагаю, будет:

/\[\[[1-9]{1,3}\]\]/g

(для числа от 1 до 3 в двойных скобках).

...