2010-12-31 16 views
6

Próbuję utworzyć funkcję stylu short-word Wordpress w PHP, aby zastąpić shortcode jak "[[133]]" obrazami. Zasadniczo, mam tabelę adresów URL/tytułów/napisów w MySQL z identyfikatorami 1-150 i chcę móc dynamicznie wstawiać je do tekstu moich stron za pomocą skrótów:Jak utworzyć funkcję stylu short-word Wordpress w PHP

Blabla bla bla bla bla. [[5]] Również, bla bla bla bla [[27]] Hej, i bla bla bla! [[129]]

Więc, po prostu chcę, aby pobrać identyfikator as $ id, a następnie karmić go do zapytania MySQL jak mysql_query ("SELECT tytuł, napisy URL z obrazami WHERE id = $ id") , a następnie zamień "[[id]]" na img/tytuł/podtytuł. Chciałbym móc to zrobić wiele razy na tej samej stronie.

Wiem, że to musi obejmować wyrażenie regularne i pewną kombinację preg_match, preg_replace, strstr, strpos, substr ... ale nie wiem od czego zacząć i które funkcje powinienem użyć, aby zrobić które rzeczy. Czy możesz polecić strategię? Nie potrzebuję samego kodu - tylko wiedząc, czego użyć, dla których części będą niezwykle pomocne.

+0

Uwaga - NIE dotyczy to witryny Wordpress, więc nie mogę korzystać z istniejących funkcji skrótów WP. – supertrue

+0

Może to również dotyczy preg_replace_callback? – supertrue

+0

Chciałbym odważyć się i powiedzieć, że prawdopodobnie można łatwo wyodrębnić związany kod z WordPress. Możesz też zrobić to, co Kyle zasugerował i zastosować jedno z wielu podejść do stworzenia własnego rozwiązania. –

Odpowiedz

4

z funkcją getimage($id) że robi kwerendę MySQL i formatuje tekst zastępczy, to prawie robi wszystko, czego potrzebujesz:

$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; 

po prostu trzeba dowiedzieć się, co umieścić wewnątrz getimage() (gdzie ?? ???), który sprawi, że zostanie wstawiony do właściwego obrazu dla prawa [[id]].

Więcej oficjalnych dokumentów można znaleźć na oficjalnej dokumentacji preg_match_all i preg_replace.

0

regex, jak sądzę, byłoby:

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

(dla liczby 1-do-3-cyfrowy wewnątrz podwójnych nawiasach.)

1

Różne różne podejścia można podjąć w tym, w zależności od jak masz zamiar wyświetlać ect,

Weźmy zdanie "Hello [34] world"

Tworzenie prostej funkcji np 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 

    } 




} 

Jeśli zostaną znalezione kolejne nawiasy, ponownie wywołaj funkcję ponownie, ponownie przekazując resztę ciągu znaków do funkcji.

Uwaga: Weryfikacja może wymagać najpierw sprawdzenia, czy [i] są odpowiednio wyważone!

5

Jeśli chcesz, aby móc napisać shortcodes tak:

[[function_name_suffix parameter1 parameter2 ...]] 

tutaj jest bardziej kompletny sposób, używając preg_replace_callback i call_user_func_array wdrożyć parametryzowane skróconych.

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); 
} 

Jeśli funkcja ta jest zdefiniowana:

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

Wtedy to wezwanie

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

wyświetli:

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

To jest po prostu coś, I wdrożone teraz na podstawie pomysł supertrue.

Wszelkie uwagi są mile widziane.

+0

No dobra, myślałem, że to działa w PHP 5.4+, ponieważ nie kodowałeś t pracują przy pierwszej próbie. Wtedy dowiedziałem się, że masz literówkę w nazwie swojej funkcji. Wywołujesz funkcję shortcodify(), ale jest ona zdefiniowana jako shortcodifiy() - "i" robi różnicę. Poprawiłem to dla ciebie. – Hexodus

+1

Przyjemny połów. Wielkie dzięki! –

0

Mój zakład jest funkcja PHP's strtr ...

<?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.</pre> 
Here is my profile image <img src='[[9]]' alt='[[1]]-[[2]]-[[3]]-[[4]]' /> 
HEREDOC_1; 
echo strtr($str, $trans); 

to wyjście jest

[http://php.net/images/logos/php-logo.svg] Nazywam się Vishal Kumar Sahu. Jestem projektantem stron internetowych i uwielbiam rysować i malować. Nie wiem, Dowolny język programowania, ale wiem, że PHP, JAVASCRIPT i HTML trochę bit. Oto mój obraz profilu [Vishal-Kumar-Sahu-Web Designer]

Działa poprawnie na 5.6.

+0

Strona dokumentacji PHP nie powinna się zmieniać. Dodam go @MegaTron: D –

Powiązane problemy