2013-06-11 3 views
2

Я работаю над проектом Wordpress, где мне нужно динамически создавать функцию (в зависимости от того, какой шаблон используется для страницы или сообщения), которая извлекает комментарии каждого страница в вопросе.Ввод правильного PHP-кода в eval() - строка

Скажем, у меня есть страницы в Wordpress с идентификаторами 100, 110, 120, 130, 140, 150, и из них 3 используется шаблон, называемый «блог» (например, 100, 130 и 150).

Так что для того, чтобы восстановить комментарии от этих 3-х страниц с помощью AJAX Мне нужно создать функцию для каждого из них:

function GetComments100() { #### } 
function GetComments130() { #### } 
function GetComments150() { #### } 

Вот код функции нужно создать индивидуально для каждой страницы (и которые идет между функциональными кронштейнами выше (вместо ####):

$defaults = array('order' => 'DESC', 'post_id' => $functionID, 'post_type' => 'page', 'count' => false); 
$comments = get_comments($defaults); 
foreach($comments as $comment) : 
echo "<div class='table-row' style='margin-bottom:1px'><div class='table-cell-1' style='width:110px;'>".$comment->comment_author.":</div><div class='table-cell-2'style='width:870px;'>".$comment->comment_content." <em><a>".$comment->comment_date." ... ".get_the_title($comment->comment_post_ID)." (".$comment->comment_post_ID.")</a></em></div></div>"; 
endforeach; 
die($results); 

для того, чтобы получить страницы, которые я использую петлю-функцию, которая дает мне идентификатор страницы в качестве переменной (в моем случае его $ functionID (также включен в массив моей функции выше).

я уже успел динамически создавать функции с помощью следующих строк кода (я знаю «Eval» не является хорошим выбором, но я не нашел никакого другого решения):

$string = 'function ' . $functionName . "() { 
#### 
}"; 
eval($string); 

Теперь вместо of #### Мне нужно интегрировать фактический функциональный код, начинающийся с «$ defaults = array (...», но, очевидно, он должен быть полностью преобразован в строку - с этим я и борюсь.

Любая помощь будет оценена (опять же, я знаю, с помощью «Eval» не хорошо, но до сих пор я не нашел другого решения для этого)

+0

Включите этот блок кода в 'function x ($ functionID)'. Затем измените на 'function GetComments100() {x (100); } '. Это будет работать? Я ничего не знаю о WordPress. –

ответ

0

Вы пробовали использовать nowdoc для тела функции? Если вам просто нужно расширение $ FunctionName, вы можете попробовать что-то вроде этого:

 $string="function {$functionName}(){".<<<'END' 
$defaults = array('order' => 'DESC', 'post_id' => $functionID, 'post_type' => 'page', 'count' => false); 
$comments = get_comments($defaults); 
foreach($comments as $comment) : 
echo "<div class='table-row' style='margin-bottom:1px'><div class='table-cell-1' style='width:110px;'>".$comment->comment_author.":</div><div class='table-cell-2'style='width:870px;'>".$comment->comment_content." <em><a>".$comment->comment_date." ... ".get_the_title($comment->comment_post_ID)." (".$comment->comment_post_ID.")</a></em></div></div>"; 
endforeach; 
die($results); 
} 
END; 

eval($string); 
+0

спасибо, что кажется правильным направлением. я протестировал его, но это не сработало, вероятно, потому, что моя версия php предшествует 5.3 ... :-(будет ли она работать и с heredoc? – bender2601

+0

Да, но избегая знаков доллара (\ $ defaults = ...) и т. д. – hammurabi

+0

Отлично! Это сработало! Большое вам спасибо - вы сделали мой день! – bender2601

0

Я не понимаю, почему вы не используете одну функцию на каждый шаблон с параметром, как это:

public function getBlogComments($id){ 
    //... 
} 

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

public function getComments($id){ 
    // get Template of $id 
    //... 
} 
+0

Я не могу использовать его таким образом, потому что я извлекаю комментарии из этих трех (в этом примере) страниц в целом на другой отдельной странице (включая форму комментариев для каждого из этих отдельных блоков комментариев). Поскольку я использую AJAX для записи и получения комментариев, мне нужна индивидуальная функция для каждого. Я уверен, что я мог бы объединить все три секции комментариев в пределах одной функции, но я хочу их для обработки индивидуально (так, например, если я пишу комментарий для pageID 130, я хочу, чтобы блок комментариев для pageID 130 обновлялся) – bender2601

Смежные вопросы