2013-02-23 55 views
1

我對php和wordpress比較陌生,我想知道如何在不包含include語句的情況下呈現php文件。將短代碼文件渲染爲wordpress插件

例如,如果我有兩個文件plugin.phpcomponent.php

plugin.php

<?php 
    add-shortcode('myshortcode', 'myshortcode-func'); 

    function myshortcode-func() 
    // magic function that loads 
    $result = LOAD('component.php'); 
    return $result; 
    } 
?> 

component.php

<div> 
    <img scr="<?php getimage() ?>" /> 
</div> 

NB 我不想使用包括因爲我認爲它會調整渲染並在調用時在頁面中插入頁面。

感謝您的幫助!

+0

如果包括螺絲渲染,那麼問題是在你的包含文件;不是在使用PHP的包含語句......也許是關閉後的換行符?> – 2013-02-23 14:38:50

+0

但包含直接包含在流中的文件,對嗎?在這裏我不想那樣。我想擁有內容,傳遞給一個函數並將其自身包含進去。 (這是一個用於簡碼的wordpress插件) – 2013-02-23 14:41:07

+0

您可能想要提高解決方案的水平,並描述您遇到的總體問題。可能需要考慮兩種或三種不同的方法。 – 2013-02-23 14:47:02

回答

3

您可以使用輸出緩衝:

function myFunc(){ 
    ob_start(); 
    include('component.php'); 
    return ob_get_clean(); 
} 
+0

這很好用。使用輸出緩衝區的缺點? – 2013-02-23 15:03:22

+1

是的,如果你過多地加載它們,它們可能會過早地溢出和打印內容。緩衝區有一個固定大小(在php.ini中定義) – 2013-02-23 15:33:36

+1

@Baptiste Pernet,你只需要小心地關閉你打開的緩衝區。我從來沒有見過緩衝區溢出,即使在堆棧中使用多個緩衝區時也是如此。無論如何,組件的輸出通常都很小。 – linepogl 2013-02-23 15:43:43

1

如何:

$php = file_get_contents("component.php"); 
eval($php); 

eval雖然是非常危險的,不應該在生產中使用。

如果這是生產,我建議使用鉤子/過濾器(請參閱WordPress的源代碼)。這使您可以即時執行代碼塊,但受到更多限制。

+0

是的,它是爲了生產......爲什麼它很危險。你如何看待輸出緩衝區的方法?你能給我一個指向什麼是鉤子和過濾器的指針嗎?非常感謝 – 2013-02-23 14:50:08

+0

eval是危險的,因爲很難知道可能會傳入什麼。 Wordpress使用鉤子/過濾器來允許插件或修改核心行爲。你可以背誦核心Wordpress或自己寫一個簡單的鉤子系統。基本上它只是一個數組,函數名稱存儲在鍵中。它們可以像'foreach($ hooks as $ hook)一樣被執行{$ hook($ data); }';這樣,至少你知道這些函數只有在附加在頂層php代碼中才能執行。 – 2013-02-23 15:00:21