2012-09-07 2 views
9

Ich habe eine Seite, auf der ich dem Benutzer erlauben, einen Absatz Text einzugeben. Fügen Sie nach diesem Text einen Shortcode ein, der eine Liste von Posts darstellt, und fügen Sie danach weiteren freien Text hinzu. Mein Gedanke war, dass sie in der Lage sein sollten, einen Shortcode einzufügen, der die Posts ausgibt. Auf diese Weise können sie einfach den Shortcode hinzufügen, an dem die Posts erscheinen sollen.Aufruf von WordPress get_template_part aus einer Shortcode-Funktion rendert Vorlage zuerst

Ich habe derzeit die Logik, die die Beiträge in einer eigenen Datei getrennt abrufen. Derzeit schließe ich es auf einer Seite, indem Sie einfach mit der get_template_part() Funktion:

get_template_part('donation', 'posts'); 

Ich sah, wie ich einen Shortcode zu erstellen und enthalten den folgenden Code in meine functions.php Datei, um den Shortcode zu erstellen:

add_shortcode('donation-posts', 'fnDonatePosts'); 
function fnDonatePosts($attr, $content) 
{ 
    get_template_part('donation', 'posts');  
} 

Die wird ordnungsgemäß ausgeführt und die Posts erscheinen, jedoch sind sie immer VOR dem Inhalt positioniert und nicht an dem Ort, an dem der Shortcode platziert wurde.

Ich habe versucht, die get_template_part() Funktion zu entfernen und nur etwas Text ausgeben und das funktioniert gut. So verstehe ich, dass die get_template_part() möglicherweise nicht der richtige Weg ist, dies zu tun, jedoch war ich nicht in der Lage, einen Weg aufzudecken, was ich versuche zu tun (ich bin sicher, dass es einen Weg gibt ... Ich habe nur Port habe es nicht gefunden).

Ich habe versucht:

include(get_template_directory(). '/donation-posts.php'); 
include_once(get_template_directory(). '/donation-posts.php') : 

Aber diese gestoppt Verarbeitung, sobald sie den PHP-Code in der Datei enthalten getroffen.

Ich habe auch versucht:

$file = file_get_contents(get_template_directory(). '/donation-posts.php'); 
     return $file; 

Aber das gibt nur die Inhalte der Datei (wie der Name der Funktion zeigt an), was bedeutet es nicht ausgeführt das PHP-Skript die Beiträge zurückzukehren.

Jeder da draußen hat das schon mal gemacht?

Antwort

18

Sie können dies versuchen, kann es Ihr Problem lösen, weil get_template_part im Grunde reagiert wie PHP's , es gibt nicht zurück aber echos der Inhalt sofort, wo es aufgerufen wurde.

add_shortcode('donation-posts', 'fnDonatePosts'); 
function fnDonatePosts($attr, $content) 
{   
    ob_start(); 
    get_template_part('donation', 'posts'); 
    $ret = ob_get_contents(); 
    ob_end_clean(); 
    return $ret;  
} 
+0

Es hat so lange gedauert, bis ich antwortete, aber ich habe eine Menge Projekte auf meinem Teller und dies ist ein Pro-Bono-Projekt, so dass es entsprechend in den Prioritäten sitzt. Wie auch immer, deine Lösung war genau das, was ich brauchte! Vielen Dank! –

+0

Sie sind willkommen :-) –

+1

es ist so eine hässliche Lösung, aber es ist das beste (nur?). – Stefan

7

Hier ist eine dynamischere Version, wo Sie den Pfad zu der Vorlage übergeben können.

function template_part($atts, $content = null){ 
    $tp_atts = shortcode_atts(array( 
     'path' => null, 
    ), $atts);   
    ob_start(); 
    get_template_part($tp_atts['path']); 
    $ret = ob_get_contents(); 
    ob_end_clean(); 
    return $ret;  
} 
add_shortcode('template_part', 'template_part'); 

Und die Kurzwahlnummer:

[template_part path="includes/social-sharing"] 
+0

Brilliant, trotz SO sagt mir, dass Kommentare nicht hier sind für * danke * Sätze kann ich nur sagen, danke, große Modularität! – Luis

1

Minimal-Version der akzeptierte Antwort:

function my_template_part_shortcode() { 
    ob_start(); 
    get_template_part('my_template'); 
    return ob_get_clean(); 
} 
add_shortcode('my_template_part', 'my_template_part_shortcode'); 

wo my-template.php die Datei, die Sie möchten, umfassen.

1

get_template_part() funktionierte nicht für mich, wenn Sie es in functions.php verwenden. Ich habe locate_template() im ob_start verwendet und stattdessen clean.Zum Beispiel:

function full_petition_shortcode($attr) { 
    ob_start(); 
    locate_template('petition.php', TRUE, TRUE); 

    return ob_get_clean(); 
} 
add_shortcode('full-petition', 'full_petition_shortcode'); 
Verwandte Themen