Лучший способ получить информацию о постах в переменных, не отображая их в Wordpress - PullRequest
1 голос
/ 18 мая 2009

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

На что я смотрел:

Я посмотрел на get_posts () для получения сообщений, а затем

getting title via the_title(),
content via the_content(),
and permalink via the_permalink()

Имейте в виду, что мне нужны эти данные после того, как все фильтры уже были применены, так что я получаю точные данные, которые будут отображаться пользователю. Кажется, что каждая из перечисленных функций применяет все необходимые фильтры и уже выполняет некоторую постобработку, и это прекрасно.

Проблема:

Проблема в том, что все эти функции, по крайней мере в WP 2.7.1 (последняя выпущенная версия прямо сейчас), по умолчанию просто отражают все и даже не возвращают ничего обратно. the_title () на самом деле поддерживает флаг, который говорит, что не печатать и не возвращать, как это

the_title(null, null, false)

Другие 2, однако, не имеют таких флагов, и такое несоответствие меня шокирует.

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

Итак, каков наилучший способ извлечь эти значения без их печати?

Пример кода

global $post;
$posts = get_posts(array('numberposts' => $limit));

foreach($posts as $post){
    $title = the_title(null, null, false); // the_title() actually supports a "do not print" flag
    $permalink = apply_filters('the_permalink', get_permalink()); // thanks, WP, for being so consistent in your functions - the_permalink() just prints /s
    $content = apply_filters('the_content', get_the_content()); // this doesn't even work - get_the_content() returns NULL for me
    print "<a href='$permalink'>$title</a><br>";
    print htmlentities($content, ENT_COMPAT, "UTF-8"). "<br>";
}

P.S. Я также рассмотрел Каков наилучший метод для создания ваших собственных циклов Wordpress? , и хотя он имеет дело с и без того очевидным способом циклического перемещения по сообщениям, решение просто печатает эти данные.

ОБНОВЛЕНИЕ: Я открыл тикет с Wordpress по этому поводу. http://core.trac.wordpress.org/ticket/9868

Ответы [ 4 ]

4 голосов
/ 18 мая 2009

Большинство функций the_stuff () в WP, которые что-то выводят, имеют свою функцию get_the_stuff (), которая возвращает что-то.

Например get_the_title(), get_permalink() ...

2 голосов
/ 18 мая 2009

Если вы не можете найти точный способ сделать это, вы всегда можете использовать буферизацию вывода.

<?php
ob_start();
echo "World";
$world = ob_get_clean();
echo "Hello $world";
?>
1 голос
/ 19 мая 2009

ОК, я все разобрал. Вот конечный результат для тех, кто заинтересован:

  • Доступ к данным каждого сообщения возможен через итерацию по массиву, возвращенному get_posts (), но эти данные будут просто находиться в базе данных, без прохождения каких-либо промежуточных фильтров
  • Предпочтительным способом является доступ к данным с использованием функций get_the_ и их оборачивания в вызове apply_filters () с соответствующим фильтром. Таким образом, будут применены все промежуточные фильтры.

apply_filters('the_permalink', get_permalink())

  • причина, по которой get_the_content() возвращала пустую строку, заключается в том, что, очевидно, сначала необходимо выполнить специальный вызов setup_postdata($post);. Тогда get_the_content() возвращает данные правильно

Спасибо всем за предложения.

0 голосов
/ 19 мая 2009

Есть ли причина, по которой вы не можете выполнять обработку во время публикации каждого отдельного сообщения или при его отображении?

Плагины WP, как правило, работают по одному посту за раз, так что для этого существует множество ловушек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...