[Инфо] Практичные WordPress шорткоды

Тема в разделе "Wordpress", создана пользователем yavasilek, 10 окт 2011.

Модераторы: DzSoft, Sorcus
  1. fuxilazo

    fuxilazo Создатель

    Регистр.:
    3 ноя 2016
    Сообщения:
    22
    Симпатии:
    6
    Данный шорткод перенаправляет PDF на GoogleDocs, что намного удобнее для пользователя.

    PHP:
    function pdflink($attr$content) {
    return 
    '<a class="pdf" href="http://docs.google.com/viewer?url=' $attr['href'] . '">'.$content.'</a>';
    }
    add_shortcode('pdf''pdflink');
    [pdf href="Перейти по ссылке"] Читать PDF [/pdf]

    выводим похожие посты

    я делаю не так, пишу просто функцию в шаблоне поста, но думаю, что многим будет полезен и этот функционал

    [related_posts]


    PHP:
    function related_posts_shortcode$atts ) {
    extract(shortcode_atts(array(
     
    'limit' => '5',
    ), 
    $atts));

    global 
    $wpdb$post$table_prefix;

    if (
    $post->ID) {
    $retval '<ul>';
    // Get tags
    $tags wp_get_post_tags($post->ID);
    $tagsarray = array();
    foreach (
    $tags as $tag) {
    $tagsarray[] = $tag->term_id;
    }
    $tagslist implode(','$tagsarray);

    // Do the query
    $q "SELECT p.*, count(tr.object_id) as count
    FROM 
    $wpdb->term_taxonomy AS tt, $wpdb->term_relationships AS tr, $wpdb->posts AS p WHERE tt.taxonomy ='post_tag' AND tt.term_taxonomy_id = tr.term_taxonomy_id AND tr.object_id = p.ID AND tt.term_id IN ($tagslist) AND p.ID != $post->ID
    AND p.post_status = 'publish'
    AND p.post_date_gmt < NOW()
    GROUP BY tr.object_id
    ORDER BY count DESC, p.post_date_gmt DESC
    LIMIT 
    $limit;";

    $related $wpdb->get_results($q);
    if ( 
    $related ) {
    foreach(
    $related as $r) {
    $retval .= '<li><a title="'.wptexturize($r->post_title).'" href="'.get_permalink($r->ID).'">'.wptexturize($r->post_title).'</a></li>';
    }
    } else {
    $retval .= '
    <li>No related posts found</li>'
    ;
    }
    $retval .= '</ul>';
    return 
    $retval;
    }
    return;
    }
    add_shortcode('related_posts''related_posts_shortcode');
     
    Последнее редактирование модератором: 6 июн 2017
    alexwweb нравится это.
  2. fuxilazo

    fuxilazo Создатель

    Регистр.:
    3 ноя 2016
    Сообщения:
    22
    Симпатии:
    6
    Вставка карты google

    [google_map src="" width="" height=""]

    • src - ссылка на карту
    • width - ширина карты в px (по умолчанию 960)
    • height - высота карты в px (по умолчанию 320)

    PHP:

    function shortcode_googlemap($atts$content null) {
         
    extract(shortcode_atts(array(
                       
    "width" => '960'//ширина по умолчанию, можете изменить на свои
                       
    "height" => '320'//высота по умолчанию, можете изменить на свои
                       
    "src" => ''
         
    ), $atts));
        
        
    $content  '<div>'//можете здесь прописать класс элементу, чтоб легче его было стилизовать
        
    $content .= '<iframe src="'.$src.'&output=embed" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="'.$width.'" height="'.$height.'"></iframe>';
        
    $content .= '</div>';

        return 
    $content;

    }

    add_shortcode("google_map""shortcode_googlemap");

    Добавляет приватные пометки в ваши записи или страницы, они будут видны только администратору.

    Шорткод ниже добавляет заметки в ваши посты, видны будут только определенному уровню пользователя, в строке current_user_can('publish_posts') замените текст в скобках на любую возможность уровня пользователей, которым вы хотите предоставить доступ к таким пометкам.
    • publish_posts - видны только администраторам
    • delete_pages - видны администраторам и редакторам
    • delete_posts - видны администраторам, редакторам и авторам
    полный перечень ролей пользователей и возможностей Перейти по ссылке

    [note]Ваш текст[/note]

    PHP:
    function sc_note$atts$content null ) {
        if ( 
    current_user_can'publish_posts' ) ) {
            return 
    '<div class="note">'.$content.'</div>'
       } else {
        return 
    ''//две одинарные кавычки
       

    }
    add_shortcode'note''sc_note' );
    Защищает ваш email от копирования, что полезно при большой посещалке сайта, защита от спама

    [email address="you@emailcompany.com"]

    PHP:
    function emailbot_ssc($attr) {
        
    extractshortcode_atts( array(
                 
    'address' => ''//здесь можно указать ваш почтовый адрес по умолчанию, чтобы не указывать его постоянно в шорткоде
                
    ), $attr ) );

        
    $email  '<a class="email_link" href="mailto:'.antispambot($attr['address']).'" title="Send Us An Email" target="_blank">';
        
    $email .= antispambot($attr['address']);
        
    $email .= '</a>';
        
       return 
    $email;
    }
    add_shortcode('email''emailbot_ssc');
    эту функцию написал сам, поэтому если найдете ошибки или же найдете более простое решение - пишите в личку, буду признателен за обратную связь

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

    шорткод [product_cats_widget] запихиваем в виджеты

    PHP:
    //список категорий товаров в сайдбаре
    function product_cats_widget_func () {

        if (
    is_singular('product')) { #если страница товара
       
            
    $content '<ul class="product-cats-list-widget">';

            
    $categories get_the_terms(get_the_ID(),'product_cat');
       
            
    $exclude ''//две одинарные кавычки

            //запоминаем все текущие категории
            
    foreach ($categories as $cats) {
                
    $curr_cats_ids[] = $cats->term_id;
                
    $exclude .= $cats->term_id ', ';
            }
           

            if (
    $categories) {
                foreach (
    $categories as $cat) {

                    
    //выводим только род категории, дочерние выводим к каждой родительской
                    
    if ($cat->parent == 0) {

                        
    $cat_link get_term_link($cat->term_id'product_cat');
                        
    $content .= '<li class="current-cat"><a href="' $cat_link '">' $cat->name '</a>';
                   
                        
    $cat_args = array(
                            
    'orderby'    => 'name',
                            
    'child_of'    => $cat->term_id,
                            
    'taxonomy' => 'product_cat',
                        );

                        
    $child_cats get_terms($cat_args);

                        
    //выводим дочерние категории, если относится к текущему товару, то помечаем
                        
    if ($child_cats) {
                            
    $content .= '<ul>';
                            foreach (
    $child_cats as $child_cat) {
                                if (
    in_array($child_cat->term_id$curr_cats_ids)) {
                                    
    $class 'class="current-cat"';
                                } else {
                                    
    $class '';
                                }
                                
    $cat_link get_term_link($child_cat->term_id'product_cat');
                                
    $content .= '<li '.$class.'><a href="'.$cat_link.'">' $child_cat->name '</a></li>';
                            }
                            
    $content .= '</ul>';
                        }
                   
                        
    $content .= '</li>';
                    }
                }
            }

            
    $content .= '</ul>';
            
    $content .= product_cats_parent_list($exclude);

        } elseif (
    is_product_category()) { //если страница категории

            
    $content '<ul class="product-cats-list-widget">';

            
    $current_cat get_queried_object();
            
    $current_cat_id $current_cat->term_id;

            
    //выявляем родительскую категорию, если текущая является дочерней, то определяем "верхнюю" и выводим все дочерние
            
    if ($current_cat->parent != ) {
                
    $cur_cat_par_id $current_cat->parent;
            } else {
                
    $cur_cat_par_id $current_cat->term_id;
            }

            
    $cur_cat_par get_term_by('id'$cur_cat_par_id'product_cat');
            
    $exclude $cur_cat_par->term_id;

            if (
    $cur_cat_par->term_id == $current_cat_id) {
                
    $class 'class="current-cat"';
            } else {
                
    $class '';
            }

            
    $cat_link get_term_link($cur_cat_par->term_id'product_cat');
            
    $content .= '<li '.$class.'><a href="' $cat_link '">' $cur_cat_par->name '</a>';
           
            
    $cat_args = array(
                
    'orderby'  => 'name',
                
    'child_of' => $cur_cat_par->term_id,
                
    'taxonomy' => 'product_cat',
            );

            
    $child_cats get_terms($cat_args);

            if (
    $child_cats) {
                
    $content .= '<ul>';
                foreach (
    $child_cats as $child_cat) {
                    if (
    $child_cat->term_id == $current_cat_id) {
                        
    $class 'class="current-cat"';
                    } else {
                        
    $class '';
                    }
                    
    $cat_link get_term_link($child_cat->term_id'product_cat');
                    
    $content .= '<li '.$class.'><a href="' $cat_link '">' $child_cat->name '</a></li>';
                }
                
    $content .= '</ul>';
            }
       
            
    $content .= '</li>';
            
    $content .= '</ul>';

            
    $content .= product_cats_parent_list($exclude);

        } else {

            
    $content '<ul class="product-cats-list-widget">';

            
    $args = array(
                
    'taxonomy'   => 'product_cat',
                
    'orderby'    => 'name',
                
    'order'      => 'ASC',
                
    'hide_empty' => true,
                
    'parent'     => '0',
            );

            
    $categories get_terms($args);
            if (
    $categories) {
                foreach (
    $categories as $cat) {
                    
    $cat_link get_term_link($cat->term_id'product_cat');
                    
    $content .= '<li><a href="'.$cat_link.'">' $cat->name '</a></li>';
                }
            }

            
    $content .= '</ul>';
        }

        return 
    $content;
    }
    add_shortcode('product_cats_widget','product_cats_widget_func');

    код самого спойлера ниже (можно использовать любое удобное вам решение, суть в скрытии контейнера <ul class="product-cats-list-widget spoiler"> (описан выше)

    PHP:
    //код в footer.php внизу, лучше, конечно, создать отдельный custom.js и туда все пихать
    <?php 
    //подключение скрипта только на страницах товара и категорий
    if (is_singular('product') || is_product_category()) : ?>
    <script type="text/javascript">
    jQuery(document).ready(function(){
        jQuery('div.spoilerinside').hide();
        jQuery('.spoilerbar .toggle').click(function(){
            jQuery(this).parents('.textwidget').find('.spoilerinside').slideToggle('fast');
        });
    });
    </script>
    <?php endif; ?>
     
    Последнее редактирование модератором: 6 июн 2017