Intereting Posts
Можно ли использовать данные из данных пользовательского поля по короткому коду на основе страницы / публикации? Пользовательский обмен сообщениями posttype Категории будут показывать только ссылки на сообщения Какой самый безопасный способ вывода пользовательского кода JavaScript и Css, введенного администратором в настройках темы? Лучший поиск для бэкэнда администратора WordPress WordPress 4.4.2, стартовая тема _s, проблемы с настраиваемым заголовком по умолчанию исключить одного ребенка по id из $ post-> post_parent Заменяйте аватары комментариев и ссылки одновременно Увеличьте категорию / срок описания слова Какие крючки следует использовать для предварительного входа и предварительной регистрации? Скрыть пункт меню по имени пользователя Как определить вывод значения атрибута shortcode? Новые строки в блоге WordPress.com? Измените шаблон, если выбран тег WP Plugins – использование включает отображение содержимого страницы

Почему Simplepie возвращает фид в неправильном порядке?

У меня есть этот фид из picasa (правильный, но произвольный, желаемый порядок).

Результат испорчен

Кроме того, с этим фидом , например.

Это нормально в обычном, отсортированном по дате фидам, но не в этом. В объекте, который я получаю от Simplepie, он имеет беспорядочный порядок. Я не делаю ничего интересного, просто перебираю результаты и показываю их в найденном порядке, используя мой коммерческий плагин галереи.

$rss_items = $rss->get_items(0, $rss->get_item_quantity($limit));

Я пробовал это (подключился к wp_feed_options ), но ничего не изменил: $rss->enable_order_by_date(false);

Кроме того, когда я делаю var_dump($rss_items); Я получаю массив, который представлен строками текста 546503 . Я не верю, что это нормально, может быть, это также забивает память, но я не могу даже вручную просматривать эти данные, чтобы увидеть, является ли порядок по своей сути плохим или просто где-то путают.

Также я не могу сказать, является ли это ошибкой обертки Simplepie или WordPress.

Solutions Collecting From Web of "Почему Simplepie возвращает фид в неправильном порядке?"

В конце class-simplepie.php есть эта строка:

 usort($items, array(get_class($urls[0]), 'sort_items')); 

Какие силовые элементы подают элементы, в случае мультифайла .

$feed->enable_order_by_date(false); действительно является очень важным и ключом к вещам, НО он игнорируется (что я испытывал), если я использую multifeed . Источник: в get_items() class-simplepie.php есть следующее:

 // If we want to order it by date, check if all items have a date, and then sort it if ($this->order_by_date && empty($this->multifeed_objects)) 

Я случайно использовал multifeed для одиночных URL-адресов. Помните, что это плагин, в котором я не знал, будет ли он одним или несколькими URL-адресами, поэтому казалось удобным всегда передавать массив fetch_feed() .

Итак, теперь это выглядит примерно так:

 $rss_url = explode(',',$rss_url); // Accept multiple URLs if(count($rss_url) == 1){ // New code $rss_url = $rss_url[0]; } add_action('wp_feed_options', array($this, 'jig_add_force_rss'), 10,2); $rss = fetch_feed($rss_url); remove_action('wp_feed_options', array($this, 'jig_add_force_rss'), 10); 

И действие:

 function jig_add_force_rss($feed,$url){ $feed->force_feed(true); $feed->enable_order_by_date(false); } 

Ваши решения работали, потому что вы передавали URL-адрес RSS как строку, а не как одноэлементный массив. Я сравнивал их с тем, как я использовал методы, и в этом была разница. Теперь он работает с и без строки запроса в URL-адресе Picasa, всегда так же, как и в браузере.

Я думаю, вам просто нужно заменить:

 $feed->enable_order_by_date(false); 

с

 $rss->enable_order_by_date(false); 

чтобы отключить упорядочение по убыванию.

В случае ошибки fetch_feed() функция fetch_feed() возвращает экземпляр класса \WP_Error . В противном случае вывод является экземпляром класса \SimplePie и этот класс содержит общедоступный метод enable_order_by_date ().

Поэтому вы должны использовать его так:

 // Fetch the feed: $rss = fetch_feed( $feed_url ); // Make sure we don't have and WP_Error instance: if ( ! is_wp_error( $rss ) ) { // Disable the date ordering: $rss->enable_order_by_date( false ); // ... etc ... } 

где мы (неявно) убедитесь, что у нас есть экземпляр класса \SimplePie .

Я понятия не имею, что происходит с этим фидом, но с этим кодом

 include_once( ABSPATH . WPINC . '/feed.php' ); $rss = fetch_feed( 'https://picasaweb.google.com/data/feed/base/user/110981376645512804522/albumid/5638371435917293985' ); foreach ($rss->get_items() as $item) { if ($enclosure = $item->get_enclosure()) { echo '<img src="'.$enclosure->get_link().'">'; } } 

Я получаю тот же порядок, что и при открытии этого канала в моем браузере. Если я оставляю в URL- ?alt=rss&kind=photo&hl=en_US , это дает проблемы, которые вы описали, и предметы находятся в неправильном порядке.

Не знаю, почему, но, может быть, вы можете работать отсюда.

Изменить: Короче говоря, может быть, проблема была в URL-адресе?


Вот хакерский способ получить правильный фид:

 $url = 'https://picasaweb.google.com/data/feed/base/user/110981376645512804522/albumid/5638371435917293985?alt=json'; // or https://picasaweb.google.com/data/feed/base/user/117541338986679044195/albumid/6129832223894216561?alt=json&kind=photo&hl=en_US&imgmax=800 $json = json_decode(file_get_contents($url)); $feed = (array)$json->feed; foreach ($feed['entry'] as $entry) { $i = 0; foreach ($entry->content as $image) { if($i % 2 != 0) { echo '<img src="'.$image.'" />'; } $i++; } } 

Поэтому я переключился на json feed и разобрал его как-то некрасиво. Но он выполняет свою работу: D $entry->content предоставляет как тип изображения, так и источник, поэтому есть дополнительные, if($i % 2 != 0) чтобы получить только каждый другой узел.

Тем не менее, я не знаю, почему RSS это делает, но альтернативный путь.

edit: чтобы добавить еще раз, вы сказали, что действительно не можете разобрать rss вручную, поэтому я просто скажу, что вы можете добавить &prettyprint=true для URL- &prettyprint=true чтобы получить более красивый канал, если вы хотите его прочитать.


Изменить число тысяч: Альтернативный путь!

 include_once( ABSPATH . WPINC . '/feed.php' ); $rss = fetch_feed( 'https://picasaweb.google.com/data/feed/base/user/117541338986679044195/albumid/6129832223894216561?alt=rss&fields=item(media:group(media:content(@url)))' ); foreach ($rss->get_items() as $item) { if ($enclosure = $item->get_enclosure()) { //echo $enclosure->get_link().'<br>'; echo '<img src="'.$enclosure->get_link().'">'; } } 

добавив ?alt=rss&fields=item(media:group(media:content(@url))) Я получил два канала, которые вы предоставили до сих пор, чтобы работать правильно! Я получил всю забавную информацию, чтобы попробовать отсюда .

Самое простое решение для тех, кто испытывает эту проблему:

 function my_add_force_rss($feed,$url){ $feed->force_feed(true); $feed->enable_order_by_date(false); } add_action('wp_feed_options', 'my_add_force_rss', 10,2); 

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