2010-12-31 8 views
6

Ich versuche, eine Wordpress Shortcode-Stil-Funktion in PHP zu erstellen, um Shortcodes wie "[[133]]" mit Bildern zu ersetzen. Grundsätzlich habe ich eine MySQL-Tabelle von Bild-URLs/Titeln/Untertiteln mit IDs 1-150, und ich möchte sie dynamisch in den Text meiner Seiten mit Shortcodes wie folgt einfügen:Wie erstellt man eine Wordpress Shortcode-Stil-Funktion in PHP

Blabla bla bla bla bla. [5]] Auch, bla bla bla bla bla [[27]] Hey, und bla bla bla! [[129]]

Also, ich möchte nur die ID als $ id packen, und er dann zu einer MySQL-Abfrage wie mysql_query ("SELECT Titel, Untertitel, URL von Bildern WHERE id = $ id") und dann ersetzen Sie die "[[ID]]" mit dem IMG/Titel/Untertitel. Ich möchte das mehrmals auf derselben Seite machen können.

Ich weiß, dass dies regex und eine Kombination aus preg_match, preg_replace, strstr, strpos, substr ... beinhalten muss, aber ich weiß nicht, wo ich anfangen soll und welche Funktionen ich verwenden soll. Kannst du eine Strategie empfehlen? Ich brauche den Code nicht selbst - nur zu wissen, was ich für welche Teile verwenden soll, wäre sehr hilfreich.

+0

Hinweis - dies ist NICHT für eine Wordpress-Site, daher kann ich die vorhandenen WP-Shortcode-Funktionen nicht verwenden. – supertrue

+0

Vielleicht beinhaltet das auch preg_replace_callback? – supertrue

+0

Ich würde eine Vermutung wagen und sagen, dass Sie wahrscheinlich den zugehörigen Code aus WordPress leicht genug extrahieren könnten. Alternativ können Sie einfach tun, was Kyle vorgeschlagen hat, und einen von vielen Ansätzen verwenden, um Ihre eigene Lösung zu erstellen. –

Antwort

4

Mit einer Funktion getimage($id), die die MySQL-Abfrage funktioniert und formatiert die Ersetzungstext, diese fast tut alles, was man braucht:

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

Ich muss nur herauszufinden, was innerhalb getimage() setzen (wo ?? ??? ist) das wird es in das richtige Bild für die richtige [[id]] setzen.

Weitere Informationen finden Sie in der offiziellen Dokumentation unter preg_match_all und preg_replace.

0

Die Regex, glaube ich, wäre:

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

(für eine 1-zu-3-stellige Zahl in doppelten eckigen Klammern.)

1

Verschiedene unterschiedliche Ansätze hierfür getroffen werden können, je nachdem, wie Sie planen, ect anzuzeigen,

Nehmen Sie den Satz "Hallo [34] Welt"

eine einfache Funktion zB replaceCode erstellen ($ 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 

    } 




} 

Wenn mehr Vorkommen von Klammern gefunden werden, rufen Sie rekursiv die Funktion wieder, wieder den Rest der Zeichenfolge an die Funktion übergeben.

Hinweis: Eventuell muss zuerst eine Validierung durchgeführt werden, um sicherzustellen, dass [und] richtig ausbalanciert sind!

5

Wenn Sie wollen in der Lage sein, dies zu schreiben, wie Kurzwahlnummern:

[[function_name_suffix parameter1 parameter2 ...]] 

hier ist eine vollständigere Art und Weise, mit preg_replace_callback und call_user_func_array zu parametrisierte Shortcodes zu implementieren.

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

Wenn diese Funktion definiert ist:

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

dieser Aufruf Dann

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

Will Ausgang:

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

Dies ist nur etwas, was ich gerade jetzt implementiert basierend auf Supertrues Idee.

Jede Rückmeldung ist mehr als willkommen.

+0

Oh ok, ich dachte, das funktioniert in PHP 5.4+, weil du Code didn ' t arbeiten auf Anhieb. Dann habe ich festgestellt, dass Sie einen Tippfehler in Ihrem Funktionsnamen haben. Sie rufen eine Funktion shortcodify() auf, aber sie ist als shortcodify() definiert - das "i" macht den Unterschied. Das habe ich für dich korrigiert. – Hexodus

+1

Schöner Fang. Danke vielmals! –

0

Meine Wette ist, PHP's strtr Funktion ...

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

es Ausgang

[http://php.net/images/logos/php-logo.svg] Mein Name Vishal Kumar ist Sahu. Ich bin ein Webdesigner und ich liebe, zu zeichnen und zu malen. Ich weiß es nicht Jede Programmiersprache, aber ich kenne PHP, JAVASCRIPT und HTML wenig Bit. Hier ist mein Profilbild [Vishal-Kumar-Sahu-Web Designer]

Es funktioniert gut auf 5.6.

+0

Die PHP-Dokumentationsseite sollte nicht geändert werden. Ich werde es @MegaTron hinzufügen: D –

Verwandte Themen