Yacc
Фиды
Добавляем рекламу к фиду.
Очень простой код с поистине безграничными возможностями на пути монетизации Ваших фидов.
Вставлять в конец functions.php
Код:
function spice_feed( $content ) {
return $content.'<br/><a href="https://www.master-x.com/forum">Forum that helps.</a>';
}
add_filter( 'the_excerpt_rss', 'spice_feed' );
add_filter( 'the_content_feed', 'spice_feed' );
Делаем новый фид.
Кто сказал, что в фиды можно отдавать только посты? Следующий код добавляет новый
RSS 2.0 фид, содержащий страницы блога. Будет полезен тем, кто использует Wordpress как CMS.
Вставлять в конец functions.php
function pages_rss2_feed() {
header('Content-Type: text/xml; charset=' . get_option('blog_charset'), true);
echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'."\n";
$bloginfo_rss_name = get_bloginfo_rss('name');
$bloginfo_rss_description = get_bloginfo_rss('description');
$bloginfo_rss_url = get_bloginfo_rss('url');
$rss_language = get_option('rss_language');
echo '<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title>'.$bloginfo_rss_name.'</title>
<atom:link href="'.$bloginfo_rss_url.'/?feed=pages-rss2" rel="self" type="application/rss+xml" />
<link>'.$bloginfo_rss_url.'/</link>
<description>'.$bloginfo_rss_description.'</description>
<pubDate>'.date('D, d M Y H:i:s +0000').'</pubDate>
<generator>yacc</generator>
<language>'.$rss_language.'</language>
<image>
<url>https://www.master-x.com/template/images/smiles/smail106.gif</url>
<title>Master-X</title>
<link>https://www.master-x.com/forum</link>
<width>21</width>
<height>22</height>
<description>Forum that helps</description>
</image>';
do_action('rss2_head');
echo '</channel>'."\n";
$args = array( 'post_type' => 'page',
'post_status' => 'publish',
'posts_per_page' => 10,
'paged' => get_query_var( 'page' ) );
$query = new WP_Query($args);
if($query->have_posts()) {
while($query->have_posts()) {
$query->the_post();
echo '<item>';
echo '<title>';
the_title();
echo '</title>';
echo '<link>';
the_permalink();
echo '</link>';
echo '<guid isPermaLink="true">';
the_permalink();
echo '</guid>';
echo '<pubDate>';
the_date();
echo '</pubDate>';
echo '<description><![CDATA[';
the_excerpt();
echo ']]></description>';
echo '<content:encoded><![CDATA[';
the_content();
echo ']]></content:encoded>';
echo '</item>';
}
}
wp_reset_postdata();
echo '</rss>';
}
function add_new_feed() {
add_feed( "pages_rss2", "pages_rss2_feed" );
}
function add_new_feed_to_header(){
echo '<link rel="alternate" type="application/rss+xml" title="'.get_bloginfo('name').' Pages Rss 2.0 Feed" href="'.get_bloginfo('wpurl').'/?feed=pages_rss2" />'."\n";
}
add_action( 'init', 'add_new_feed', 10 );
add_action( 'wp_head', 'add_new_feed_to_header' );
Последний раз редактировалось: Yacc (05/03/11 в 20:10), всего редактировалось 2 раз(а)
Yacc
Аякс
Бесконечный блог.
Идея проста как три копейки: когда пользователь, прокручивая страницу, приближается к её концу, мы, с помощью нехитрого сценария асинхронно подгружаем следующую пачку постов, взятых из специально подготовленного фида.
Ради простоты изложения мне пришлось отказаться от универсальности и оптимизировать код для стандартной Wordpress темы Twentyten. По той же причине я никак специально не обрабатываю посты типа Gallery и Aside.
Поэтому, если у Вас установлена другая тема или Вы вносили изменения в стандартную, то, скорее всего, на Вашем блоге этот код работать не будет. Однако обладая минимальными познаниями в php и javascript его можно легко модернизировать под любую тему.
Кроме того всегда можно стукнуть мне в аську и получить готовое решение за символическое вознаграждение или доброе слово.
Итак. Первым делом воспользуемся шаблоном из предыдущего поста и создадим новый фид.
Вставлять в конец functions.php
function yacc_rss2_feed() {
header('Content-Type: text/xml; charset=' . get_option('blog_charset'), true);
echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'."\n";
$bloginfo_rss_name = get_bloginfo_rss('name');
$bloginfo_rss_description = get_bloginfo_rss('description');
$bloginfo_rss2_url = get_bloginfo_rss('rss2_url');
$rss_language = get_option('rss_language');
echo '<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title>'.$bloginfo_rss_name.'</title>
<atom:link href="'.$bloginfo_rss2_url.'" rel="self" type="application/rss+xml" />
<link>'.$bloginfo_rss2_url.'/</link>
<description>'.$bloginfo_rss_description.'</description>
<pubDate>'.date('D, d M Y H:i:s +0000').'</pubDate>
<generator>yacc</generator>
<language>'.$rss_language.'</language>';
do_action('rss2_head');
echo '</channel>'."\n";
$args = array( 'post_type' => 'post',
'post_status' => 'publish',
'posts_per_page' => 10,
'paged' => get_query_var( 'page' ),
'ignore_sticky_posts' => 1 );
$query = new WP_Query($args);
if($query->have_posts()) {
while($query->have_posts()) {
$query->the_post();
echo '<item>';
echo '<postid>';
the_ID();
echo '</postid>';
echo '<postclass>';
post_class();
echo '</postclass>';
echo '<description><![CDATA[';
echo '<h2 class="entry-title"><a href="';
the_permalink();
echo '" title="Permalink to ';
the_title_attribute();
echo '" rel="bookmark">';
the_title();
echo '</a></h2>';
echo '<div class="entry-meta">';
twentyten_posted_on();
echo '</div>';
echo '<div class="entry-content">';
the_content();
wp_link_pages( array( 'before' => '<div class="page-link">Pages: ', 'after' => '</div>' ) );
echo '</div>';
echo '<div class="entry-utility">';
twentyten_posted_in();
echo '<span class="comments-link">';
comments_popup_link( 'Leave a comment', '1 Comment', '% Comments' );
echo '</span>';
edit_post_link( 'Edit', '<span class="meta-sep">|</span> <span class="edit-link">', '</span>' );
echo '</div>';
echo ']]></description>';
echo '</item>';
}
}
wp_reset_postdata();
echo '</rss>';
}
function add_new_feed() {
add_feed( "yacc_rss2", "yacc_rss2_feed" );
}
add_action( 'init', 'add_new_feed', 10 );
Обратите внимание на отсутсвие многих элементов обязательных в RSS 2.0 фидах. Более того в нём есть элементы которых нет в спецификации.
По этой причине я не добавляю ссылку на новый фид в секцию head, дабы не вводить в заблуждения всевозможные "читалки".
Теперь собственно аякс. Создайте в папке twentyten новую папку js. И положите в неё этот код под именем unlimited.js
function ajax( args ) {
args = {
type: args.type || "POST",
url: args.url || "",
timeout: args.timeout || 5000,
onComplete: args.onComplete || function(){},
onError: args.onError || function(){},
onSuccess: args.onSuccess || function(){},
data: args.data || ""
};
var request = new XMLHttpRequest();
request.open(args.type, args.url, true);
var timeoutLength = args.timeout;
var requestDone = false;
setTimeout(function(){
requestDone = true;
}, timeoutLength);
request.onreadystatechange = function(){
if ( request.readyState == 4 && !requestDone ) {
if ( isSuccess( request ) ) {
args.onSuccess( getData( request, args.type ) );
} else {
args.onError();
}
args.onComplete();
request = null;
}
};
request.send();
function isSuccess(r) {
try {
return !r.status && location.protocol == "file:"
|| ( r.status >= 200 && r.status < 300 )
|| r.status == 304
|| navigator.userAgent.indexOf("Safari") >= 0
&& typeof r.status == "undefined";
}
catch(e){}
return false;
}
function getData(r,type) {
var ct = r.getResponseHeader("content-type");
var data = !type && ct && ct.indexOf("xml") >= 0;
data = type == "xml" || data ? r.responseXML : r.responseText;
if ( type == "script" ) eval.call( window, data );
return data;
}
}
function toXml(text){
if (window.ActiveXObject){
var xml = new ActiveXObject('Microsoft.XMLDOM');
xml.async = 'false';
xml.loadXML(text);
} else {
var parser = new DOMParser();
var xml = parser.parseFromString(text, 'text/xml');
}
return xml;
}
function scrollY() {
var d = document.documentElement;
return self.pageYOffset || ( d && d.scrollTop ) || document.body.scrollTop;
}
function windowHeight() {
var d = document.documentElement;
return self.innerHeight || ( d && d.clientHeight ) || document.body.clientHeight;
}
function main() {
var curPage = 1;
var loading = false;
window.onscroll = function(){
if ( curPage >= 1 && !loading && document.body.scrollHeight - scrollY() - windowHeight() < windowHeight() ) {
loading = true;
ajax({
type: "GET",
data: "xml",
url: "./?feed=yacc_rss2&page=" + ( ++curPage ),
onSuccess: function( rss ){
var content = document.getElementById("content");
var result = '';
xml = toXml(rss);
var items = xml.getElementsByTagName("item");
for ( var i = 0; i < items.length; i++ ) {
content.appendChild( createPost( items[i] ) );
}
if ( items.length == 0 ) {
curPage = 0;
}
},
onComplete: function(){
loading = false;
}
});
}
};
}
function createPost( elem ) {
var data = getPostData( elem );
var div = document.createElement("div");
div.id = 'post-' + data.id;
div.className = data.class.replace('class="', '').replace('"', '');
div.innerHTML = data.description;
return div;
}
function getPostData( elem ) {
return {
id: elem.getElementsByTagName("postid")[0].firstChild.nodeValue,
class: elem.getElementsByTagName("postclass")[0].firstChild.nodeValue,
description: elem.getElementsByTagName("description")[0].firstChild.nodeValue
};
}
Необходимо добавить этот сценарий в секцию head. Опять же простоты ради я вызываю его только на главной странице. С тем же успехом и минимальными изменениями его можно вызывать и на страницах архивов. Оставляю это в качестве упражнения тебе, дорогой читатель.
Код:
<?php
if( is_home() ) {
echo '<script src="'.get_bloginfo("template_url").'/js/unlimited.js"></script>';
}
?>
Осталось вызвать главную функцию после загрузки страницы:
Код:
<body <?php body_class(); if( is_home() ) { echo 'onload="main();"'; } ?>>
И не забудьте обернуть в noscript страничную навигацию.
Код:
<noscript>
<?php if ( $wp_query->max_num_pages > 1 ) : ?>
<div id="nav-below" class="navigation">
<div class="nav-previous"><?php next_posts_link( __( '<span class="meta-nav">←</span> Older posts', 'twentyten' ) ); ?></div>
<div class="nav-next"><?php previous_posts_link( __( 'Newer posts <span class="meta-nav">→</span>', 'twentyten' ) ); ?></div>
</div><!-- #nav-below -->
<?php endif; ?>
</noscript>
Последний раз редактировалось: Yacc (05/03/11 в 20:11), всего редактировалось 3 раз(а)