С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 05/03/11 в 00:20 |
Фиды
Добавляем рекламу к фиду.
Очень простой код с поистине безграничными возможностями на пути монетизации Ваших фидов.
Вставлять в конец 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 раз(а)
|
|
|
|
С нами с 12.08.09
Сообщения: 619
Рейтинг: 633
|
Добавлено: 05/03/11 в 01:10 |
Yacc: Контекстный баннер, нужная в хозяйстве весчь. Если выбрать Context по Post title сильно нагрузит блог при большом количестве постов? Плагин работает "на лету" или како-то кеш имеется?
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 05/03/11 в 01:21 |
Аякс
Бесконечный блог.
Идея проста как три копейки: когда пользователь, прокручивая страницу, приближается к её концу, мы, с помощью нехитрого сценария асинхронно подгружаем следующую пачку постов, взятых из специально подготовленного фида.
Ради простоты изложения мне пришлось отказаться от универсальности и оптимизировать код для стандартной 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 раз(а)
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 05/03/11 в 01:28 |
Lenskiy писал: | Yacc: Контекстный баннер, нужная в хозяйстве весчь. Если выбрать Context по Post title сильно нагрузит блог при большом количестве постов? Плагин работает "на лету" или како-то кеш имеется? |
1. Это не плагин, а виджет.
2. Баннер показывается только на страницах одиночных постов, т.е. количество постов значения не имеет. По этой и ряду других причин нет необходимости в кэшировании.
|
|
|
|
С нами с 12.08.09
Сообщения: 619
Рейтинг: 633
|
Добавлено: 05/03/11 в 19:11 |
Это не виджет, а просто праздник какой-то!
Yacc ты охуенен
|
|
|
|
С нами с 12.08.09
Сообщения: 619
Рейтинг: 633
|
Добавлено: 06/03/11 в 16:21 |
Yacc: А можно заглушку сделать? Например если в контексте не будет не одного ключевого слова, то показывать баннер заглушку.
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 06/03/11 в 16:47 |
Если быстро, то надо найти в коде виджета функцию widget и заменить в ней
Код: | {
echo $ads[$keyword];
} |
на
Код: | {
echo $ads[$keyword];
}
else { ?>
<a href=""><img src="" /></a>
<?php } |
|
|
|
|
завлекаю текстами
С нами с 30.04.09
Сообщения: 1610
Рейтинг: 1165
|
Добавлено: 06/03/11 в 18:02 |
едрить матить, чего я сразу не подписался на топик
это ж как газета блоговодства
|
|
|
|
С нами с 12.08.09
Сообщения: 619
Рейтинг: 633
|
Добавлено: 06/03/11 в 19:20 |
Yacc писал: | Если быстро, то надо найти в коде виджета функцию widget и заменить в ней
|
функцию заменить не долго. Но надо ведь что-то в виджете писать на месте кея?
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 06/03/11 в 19:52 |
В виджете ничего писать не надо.
Если в выбранном контексте ничего не будет найдено покажется дефолтный баннер (то что выделено красным в предыдущем посте).
|
|
|
|
С нами с 12.08.09
Сообщения: 619
Рейтинг: 633
|
Добавлено: 07/03/11 в 19:49 |
Все работает Отличный виджет, заменил несколько плагинов и осуществил давнюю хотелку.
А можно к нему еще код вывода в любом месте записи?
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 08/03/11 в 06:45 |
Shortcodes
Виджеты
С помощью этого shortcode Вы можете вывести любой виджет в любом месте шаблона.
Вставлять в конец файла functions.php
Код: | function widget($atts) {
global $wp_widget_factory;
extract( shortcode_atts( array( 'name' => false ), $atts ) );
$n = explode( '-', esc_html( $name ) );
$id = array_pop( $n );
$nice_name = 'widget_' . implode( '-', $n );
$class_name = 'WP_Widget_' . implode( '_', array_map( 'ucfirst', $n ) );
if( ! is_a( $wp_widget_factory->widgets[$class_name], 'WP_Widget' ) ) return;
$options = get_option( $nice_name );
if( !array_key_exists( $id, $options ) ) { return; }
ob_start();
the_widget( $class_name, $options[$id], array( 'widget_id' => $name ) );
$output = ob_get_contents();
ob_end_clean();
return $output;
}
add_shortcode( 'widget', 'widget' ); |
Использование.
Если вставляете в пост:
Код: | [widget name='widget_id'] |
Если вставляете в файл шаблона:
Код: | <?php echo do_shortcode( "[widget name='widget_id']" ); ?> |
Узнать widget_id можно несколькими способами.
- посмотреть в коде страницы:
Код: | <li id="recent-posts-2" class="widget-container widget_recent_entries"> |
- посмотреть в поле widget_название-виджета таблицы wp_options:
- смотреть в форме настроек виджета, предварительно добавив в метод form этого виджета:
Код: | <?php echo $this->id; ?> |
Например вызвать обновлённый виджет Контекстный Баннер можно так:
Код: | [widget name='context-banner-5'] |
Стоит отметить, что никакой особой "защиты от дурака" нет. Поэтому не надо вводить несуществующие widget_id. В лучшем случае Вы ничего не увидите, в худшем, при включенной отладке, получите сообщение об ошибке.
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 08/03/11 в 06:48 |
Lenskiy: Я ответил на твой вопрос?
|
|
|
|
С нами с 12.08.09
Сообщения: 619
Рейтинг: 633
|
Добавлено: 08/03/11 в 10:53 |
ID виджета нашел, но не могу правильно код для шаблона составить. В шаблоне просто появляется шорткод. Баннеров нет, ошибок нет.
Код: | <?php echo do_shortcode( "[widget name='widget_id="5"']" ); ?> |
или
Код: | <?php echo do_shortcode( "[widget name='widget_id=5']" ); ?> |
или
Код: | <?php echo do_shortcode( "[widget name='context_banner_widget-5']" ); ?> |
или
Код: | <?php echo do_shortcode( "[context_banner_widget='5']" ); ?> |
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 08/03/11 в 14:34 |
Например вызвать обновлённый виджет Контекстный Баннер можно так:
Код: | [widget name='context-banner-5'] |
Или так:
Цитата: | <?php echo do_shortcode( "[widget name='context-banner-5']" ); ?> |
|
|
|
|
С нами с 12.08.09
Сообщения: 619
Рейтинг: 633
|
Добавлено: 08/03/11 в 16:42 |
delete
Последний раз редактировалось: Lenskiy (09/03/11 в 21:30), всего редактировалось 1 раз
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 08/03/11 в 16:51 |
Lenskiy писал: | Где ошибся? |
Возьми обновлённую версию виджета.
Код: | <?php echo do_shortcode( "[widget name='context-banner-5']" ); ?> |
Если и это не поможет - стучи в аську, разберёмся.
|
|
|
|
С нами с 12.08.09
Сообщения: 619
Рейтинг: 633
|
Добавлено: 09/03/11 в 15:02 |
не работает же!
Parse error: syntax error, unexpected '}' /public_html/wp-content/themes/f2/functions.php on line 640
два раза пробовал, оба раза одинаковая ошибка.
Проверь еще раз код, может где-то что-то упустил. Может это <?php
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 09/03/11 в 15:43 |
Lenskiy писал: | не работает же!
Parse error: syntax error, unexpected '}' /public_html/wp-content/themes/f2/functions.php on line 640 |
А что у тебя в строках 630-650?
Скопипастил себе код из поста, проверил - работает.
|
|
|
|
С нами с 12.08.09
Сообщения: 619
Рейтинг: 633
|
Добавлено: 09/03/11 в 16:42 |
до внесения кода виджета в файле functions.php было 600 строк и все работало. Стало быть ошибка во внесенном коде. а если быть точным между 30-50 строчками.
Проверил код на другом сайте, там вообще все фатально накрылось
Fatal error: Call to undefined function has_post_thumbnail() in /public_html/wp-content/themes/Selalu/index.php on line 11
Может еще кто попробует вставить код?
|
|
|
|
С нами с 28.04.08
Сообщения: 623
Рейтинг: 687
|
Добавлено: 09/03/11 в 17:52 |
Lenskiy: ну он же тебе явно пишет, неожиданный }, лишний символ у тебя где то..., пости файл полностью, найдем где именно, если сам не можешь...
|
|
|
|
С нами с 28.04.08
Сообщения: 623
Рейтинг: 687
|
Добавлено: 09/03/11 в 17:54 |
Lenskiy писал: |
Проверил код на другом сайте, там вообще все фатально накрылось
Fatal error: Call to undefined function has_post_thumbnail() in /public_html/wp-content/themes/Selalu/index.php on line 11
|
версия WP(точнее просто не может данную функцию найти) не имеет данной функции has_post_thumbnail() ! Интерпретатор же пишет все...
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 09/03/11 в 18:00 |
has_post_thumbnail поддерживается начиная с версии 2.9
скопипастил ещё раз - всё работает.
Код: | ...
echo $ads[$keyword];
}
}
}
}
} ?>
</div>
<?php
echo $after_widget; // Строка 40. Всё нормально.
}
function update( $new_instance, $old_instance ) {
... |
|
|
|
|
С нами с 12.08.09
Сообщения: 619
Рейтинг: 633
|
Добавлено: 09/03/11 в 18:13 |
А как выложить код свернутый? Нехочется тут длиннющую портянку лепить.
|
|
|
|
С нами с 28.04.08
Сообщения: 623
Рейтинг: 687
|
Добавлено: 09/03/11 в 18:19 |
code hidden - /code , квадратные скобки упущены..
p.s. для администрации, надо бы по дефолту hidden поставить, как раньше, имхо так удобнее было...
|
|
|
|