Master-X
Форум | Новости | Статьи
Главная » Форум » Блоги и Социальные сети » 
Тема: Wordpress How To
цитата
05/03/11 в 00:20
 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 раз(а)
цитата
05/03/11 в 01:10
 Lenskiy
Yacc: Контекстный баннер, нужная в хозяйстве весчь. Если выбрать Context по Post title сильно нагрузит блог при большом количестве постов? Плагин работает "на лету" или како-то кеш имеется?
цитата
05/03/11 в 01:21
 Yacc
Аякс

Бесконечный блог.

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

Ради простоты изложения мне пришлось отказаться от универсальности и оптимизировать код для стандартной Wordpress темы Twentyten. По той же причине я никак специально не обрабатываю посты типа Gallery и Aside.

Поэтому, если у Вас установлена другая тема или Вы вносили изменения в стандартную, то, скорее всего, на Вашем блоге этот код работать не будет. Однако обладая минимальными познаниями в php и javascript его можно легко модернизировать под любую тему.

Кроме того всегда можно стукнуть мне в аську и получить готовое решение за символическое вознаграждение или доброе слово. icon_smile.gif

Итак. Первым делом воспользуемся шаблоном из предыдущего поста и создадим новый фид.

Вставлять в конец 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. Опять же простоты ради я вызываю его только на главной странице. С тем же успехом и минимальными изменениями его можно вызывать и на страницах архивов. Оставляю это в качестве упражнения тебе, дорогой читатель. icon_smile.gif

Код:
<?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">&larr;</span> Older posts', 'twentyten' ) ); ?></div>
      <div class="nav-next"><?php previous_posts_link( __( 'Newer posts <span class="meta-nav">&rarr;</span>', 'twentyten' ) ); ?></div>
   </div><!-- #nav-below -->
<?php endif; ?>
</noscript>


Последний раз редактировалось: Yacc (05/03/11 в 20:11), всего редактировалось 3 раз(а)
цитата
05/03/11 в 01:28
 Yacc
Lenskiy писал:
Yacc: Контекстный баннер, нужная в хозяйстве весчь. Если выбрать Context по Post title сильно нагрузит блог при большом количестве постов? Плагин работает "на лету" или како-то кеш имеется?

1. Это не плагин, а виджет.
2. Баннер показывается только на страницах одиночных постов, т.е. количество постов значения не имеет. По этой и ряду других причин нет необходимости в кэшировании.
цитата
05/03/11 в 19:11
 Lenskiy
Это не виджет, а просто праздник какой-то!
Yacc ты охуенен smail54.gif
цитата
06/03/11 в 16:21
 Lenskiy
Yacc: А можно заглушку сделать? Например если в контексте не будет не одного ключевого слова, то показывать баннер заглушку.
цитата
06/03/11 в 16:47
 Yacc
Если быстро, то надо найти в коде виджета функцию widget и заменить в ней

Код:
{
  echo $ads[$keyword];
}

на

Код:
{
  echo $ads[$keyword];
}
else { ?>
  <a href=""><img src="" /></a>
<?php }
цитата
06/03/11 в 18:02
 Crappyday
едрить матить, чего я сразу не подписался на топик icon_eek.gif
это ж как газета блоговодства smail101.gif
цитата
06/03/11 в 19:20
 Lenskiy
Yacc писал:
Если быстро, то надо найти в коде виджета функцию widget и заменить в ней

функцию заменить не долго. Но надо ведь что-то в виджете писать на месте кея? icon_cool.gif
цитата
06/03/11 в 19:52
 Yacc
В виджете ничего писать не надо.
Если в выбранном контексте ничего не будет найдено покажется дефолтный баннер (то что выделено красным в предыдущем посте).
цитата
07/03/11 в 19:49
 Lenskiy
Все работает smail54.gif Отличный виджет, заменил несколько плагинов и осуществил давнюю хотелку.
А можно к нему еще код вывода в любом месте записи? icon_rolleyes.gif
цитата
08/03/11 в 06:45
 Yacc
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. В лучшем случае Вы ничего не увидите, в худшем, при включенной отладке, получите сообщение об ошибке.
цитата
08/03/11 в 06:48
 Yacc
Lenskiy: Я ответил на твой вопрос? icon_smile.gif
цитата
08/03/11 в 10:53
 Lenskiy
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']" ); ?>
цитата
08/03/11 в 14:34
 Yacc


Например вызвать обновлённый виджет Контекстный Баннер можно так:

Код:
[widget name='context-banner-5']


Или так:

Цитата:
<?php echo do_shortcode( "[widget name='context-banner-5']" ); ?>
цитата
08/03/11 в 16:42
 Lenskiy
delete

Последний раз редактировалось: Lenskiy (09/03/11 в 21:30), всего редактировалось 1 раз
цитата
08/03/11 в 16:51
 Yacc
Lenskiy писал:
Где ошибся?

Возьми обновлённую версию виджета. icon_smile.gif

Код:
<?php echo do_shortcode( "[widget name='context-banner-5']" ); ?>


Если и это не поможет - стучи в аську, разберёмся.
цитата
09/03/11 в 15:02
 Lenskiy
не работает же!
Parse error: syntax error, unexpected '}' /public_html/wp-content/themes/f2/functions.php on line 640
два раза пробовал, оба раза одинаковая ошибка.
Проверь еще раз код, может где-то что-то упустил. Может это <?php
цитата
09/03/11 в 15:43
 Yacc
Lenskiy писал:
не работает же!
Parse error: syntax error, unexpected '}' /public_html/wp-content/themes/f2/functions.php on line 640

А что у тебя в строках 630-650?

Скопипастил себе код из поста, проверил - работает. icon_smile.gif
цитата
09/03/11 в 16:42
 Lenskiy
до внесения кода виджета в файле 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
icon_confused.gif
Может еще кто попробует вставить код?
цитата
09/03/11 в 17:52
 Ado.Blogs
Lenskiy: ну он же тебе явно пишет, неожиданный }, лишний символ у тебя где то..., пости файл полностью, найдем где именно, если сам не можешь...
цитата
09/03/11 в 17:54
 Ado.Blogs
Lenskiy писал:

Проверил код на другом сайте, там вообще все фатально накрылось
Fatal error: Call to undefined function has_post_thumbnail() in /public_html/wp-content/themes/Selalu/index.php on line 11
icon_confused.gif



версия WP(точнее просто не может данную функцию найти) не имеет данной функции has_post_thumbnail() ! Интерпретатор же пишет все...
цитата
09/03/11 в 18:00
 Yacc
has_post_thumbnail поддерживается начиная с версии 2.9

скопипастил ещё раз - всё работает.

Код:
...
                        echo $ads[$keyword];
                     }
                  }
               }
            }
         } ?>
         </div>
      <?php
      echo $after_widget; // Строка 40. Всё нормально. icon_smile.gif
   }
   
   function update( $new_instance, $old_instance ) {
...
цитата
09/03/11 в 18:13
 Lenskiy
А как выложить код свернутый? Нехочется тут длиннющую портянку лепить.
icon_cool.gif
цитата
09/03/11 в 18:19
 Ado.Blogs
code hidden - /code , квадратные скобки упущены..

p.s. для администрации, надо бы по дефолту hidden поставить, как раньше, имхо так удобнее было...
Стр. « первая   <  1, 2, 3, 4, 5  >  последняя »


Эта страница в полной версии