• DONATE to NULLED!
    Вы можете помочь Форуму и команде, поддержать финансово.
    starwanderer - модератор этого раздела будет Вам благодарен!

Помощь Вызов определённого виджета в wordpress напрямую в шаблоне, через php функцию или шорткод.

Статус
В этой теме нельзя размещать новые ответы.

r0nin

Постоялец
Регистрация
12 Апр 2010
Сообщения
78
Реакции
4
Вообщем нужно что-то вроде плагина который показывает "Hot Topics" или простыми словами говоря актуальные темы. Через некоторое время пришло в голову следующее решение - последние теги. Решил протестить плагин wp recent tags который выводит последние теги - то есть теги с последних постов.
Но вот в чём проблема - данный плагин работает только в режиме виджета, а я хотел его вызывать из шаблона. Либо как-то надо вызывать функцию плагина , либо надо вызывать сам виджет.

Вот плагин ксати :
PHP:
<?php
/*
Plugin Name: WP Recent Tags
Plugin URI: http://www.mashget.com/2008/09/18/wp-recent-tags-for-wordpress/
Description: Show the recent tags.
Author: Andrew Zhang
Version: 0.1.1
Author URI: http://www.mashget.com
*/
if  (!class_exists('RecentTags')):
class RecentTags
{
    var $plugin_name="WP Recent Tags";
    var $plugin_version="0.1.1";
    var $plugin_uri="http://www.mashget.com";
 
    var $wptTable;
    var $post_tag_update_count_callback;
    var $tagcount_update_log=array();
    var $rtOptions;
 
    function RecentTags()
    {
        global $wpdb;
        $this->wptTable=$wpdb->prefix . 'wpt_recent_tagcount';
        $this->rtOptions=get_option('widget_recent_tags');
        if(!$this->rtOptions)
        {
            $this->rtOptions=$this->get_def_options();
        }
        $taxonomy = get_taxonomy('post_tag');       
        if (!empty($taxonomy->update_count_callback) )
        {
            $this->post_tag_update_count_callback=$taxonomy->update_count_callback;
            $taxonomy->update_count_callback=array(&$this,'post_tag_update_count');
            add_action('wp_insert_post', array(&$this,'check_tagcount_update_log'), PHP_INT_MAX, 2);
        }
        if($this->rtOptions['style_css_enabled'])
        {
            add_action('wp_head', array(&$this,'generate_rtstyle'));
        }
       
        add_action('delete_term', array(&$this,'deletetagstat'));
        add_action('widgets_init', array(&$this, 'register_wrt_widget' ));
        add_action('admin_menu', array(&$this,'add_options_page'));
    }
   
    function get_def_options()
    {
        return array(
                'title'=>'Recent Tags',
                'postsnum'=>10,
                'tagsnum'=>15,
                'style'=>'cloud',
                "style_css_enabled" => "1",
                "cloud_style_css" =>"ul.recent-tags li { display:inline; border:0; }
                    ul.recent-tags li a { font-weight:400; line-height:120%; margin:0 0.5em 0 0; }
                    ul.recent-tags li .S3 { font-size:13pt; }
                    ul.recent-tags li .S2 { font-size:11pt; }
                    ul.recent-tags li .S1 { font-size:8pt; }
                    ",
                "list_style_css" =>"ul.recent-tags li { border:0; }
                    ul.recent-tags li a { font-weight:400; line-height:120%; margin:0 0.5em 0 0; }
                    ",
            );
    }
   
    function add_options_page()
    {
        if (function_exists('add_options_page'))
        {
            add_options_page( $this->plugin_name, $this->plugin_name, 8, basename(__FILE__), array(&$this,'wp_recent_tags_options_subpanel'));
        }
    }
 
    function wp_recent_tags_options_subpanel()
    {
        if($_POST["wp_rt_submit"])
        {
            $wp_settings = array (
                "style_css_enabled" => $_POST['style_css_enabled']? "1":false,
                "cloud_style_css" => $_POST['cloud_style_css'],
                "list_style_css" => $_POST['list_style_css'],
            );
            $wp_settings=array_merge($this->rtOptions, $wp_settings);
            update_option("widget_recent_tags",$wp_settings);
            echo '<div id="message" class="updated fade"><p>Options Updated</p></div>';
        }
        else if($_POST["wp_rt_load_default"])
        {
            $def=$this->get_def_options();
            $wp_settings = array (
                "cloud_style_css" => $def["cloud_style_css"],
                "list_style_css" => $def["list_style_css"],
            );
            $wp_settings=array_merge($this->rtOptions, $wp_settings);
            update_option("widget_recent_tags",$wp_settings);
            echo '<div id="message" class="updated fade"><p>Options Reset</p></div>';
        }
        else
        {
            $wp_settings=$this->rtOptions;
        }
        ?>
        <div class="wrap">
          <form action="<?php echo $_SERVER['PHP_SELF']; ?>?page=recent-tags.php" method="post">
            <h2><?php echo $this->plugin_name;?> Options</h2>
            <table class="form-table">
              <tr valign="top">
                <td>       
                <input name="style_css_enabled" type="checkbox" id="style_css_enabled" value="1" <?php checked('1', ($wp_settings["style_css_enabled"]==="1")); ?> />
                <label for=style_css_enabled><strong>Output style in the page</strong></label> (Or you may want to put these in your own css)
                <p>
                    <a name="rt-cloud"></a>
                    <label>For Cloud</label>
                    <br/>
                    <textarea name="cloud_style_css" rows="5" cols="80"><?php echo str_replace("\t","",$wp_settings["cloud_style_css"]); ?></textarea>
                </p>
                <p>
                    <a name="rt-list"></a>
                    <label>For List</label>
                    <br/>
                    <textarea name="list_style_css" rows="5" cols="80"><?php echo str_replace("\t","",$wp_settings["list_style_css"]); ?></textarea>
                </p>
                </td>
              </tr>
            </table>
            <p class="submit">
              <input type="submit" name="wp_rt_load_default" value="Reset to Default Options &raquo;" class="button" onclick="return confirm('Are you sure to reset options?')" />
              <input type="submit" name="wp_rt_submit" value="Save Options &raquo;" class="button" style="margin-left:15px;" />
            </p> 
          </form>
        </div>
        <?php
    }
   
    function register_wrt_widget()
    {
        if (!function_exists( 'register_sidebar_widget' ))return;
        register_sidebar_widget($this->plugin_name, array(&$this, 'generate_wrt_widget' ));
        register_widget_control($this->plugin_name, array(&$this, 'wrt_widget_control' ) );
    }
 
    function wrt_widget_control()
    {   
        $options = $newoptions = $this->rtOptions;
        if (isset($_POST['recent-tags-title']))
        {
            $newoptions['title'] =(stripslashes($_POST['recent-tags-title']));
            $newoptions['postsnum']=intval($_POST['recent-tags-rcposts-num']);
            $newoptions['tagsnum']=intval($_POST['recent-tags-maxtags-num']);
            $newoptions['style']=($_POST['recent-tags-style']);
        }
        if ( $options != $newoptions )
        {
            if($newoptions['postsnum'] > $options['postsnum'])
            {
                $this->preRtdata(intval($newoptions['postsnum']));
            }
            $options = $newoptions;
            update_option('widget_recent_tags', $options);
        }       
       
        $title = attribute_escape($options['title'] );
        $postsnum = $options['postsnum'];
        $tagsnum =$options['tagsnum'];
       
        if(!class_exists("WidgetCache"))
        {
            ?>
            <p>
            <i>
            You might use <a href='http://wordpress.org/extend/plugins/wp-widget-cache/' target='_blank'>
            WP Widget Cache</a>
            to improve performance</i>
            </p>
            <?php
        }
        ?>
        <p>
        <label for="recent-tags-title">
        Title: <input type="text" id="recent-tags-title" name="recent-tags-title" value="<?php echo $title ?>" style="width: 200px;"/>
        </label>
        </p>
        <p>
        <label for="recent-tags-maxtags-num">
        Number of tags to show: <input type="text" size="2" id="recent-tags-maxtags-num" name="recent-tags-maxtags-num" value="<?php echo $tagsnum ?>"  style="text-align:center;"/>
        </label>
        </p>
        <p>
        <label for="recent-tags-rcposts-num">
        Show the tags in recent <input type="text" size="2" id="recent-tags-rcposts-num" name="recent-tags-rcposts-num" value="<?php echo $postsnum ?>" style="text-align:center;"/> posts
        </label> (<a href="http://www.mashget.com/2008/09/18/wp-recent-tags-for-wordpress/#recent" target="_blank">?</a>)
        </p>   
        <p>
        Output style:
            <label for="recent-tags-style-cloud">
                <input type="radio" id="recent-tags-style-cloud" name="recent-tags-style" value="cloud" <?php checked('1', $options['style']=="cloud"); ?> /> Cloud
            </label> (<a href='/wp-admin/options-general.php?page=recent-tags.php#rt-cloud' target='_blank'>css</a>)
            <label for="recent-tags-style-list">
                <input type="radio" id="recent-tags-style-list" name="recent-tags-style" value="list" <?php checked('1', $options['style']=="list"); ?> /> List
            </label> (<a href='/wp-admin/options-general.php?page=recent-tags.php#rt-list' target='_blank'>css</a>)
        </p>
        <?php
    }
 
    function generate_rtstyle()
    {
        echo "<!--$this->plugin_name $this->plugin_version ($this->plugin_uri) Begin -->\n";
        echo "<style>\n";
        echo str_replace("\t","",$this->rtOptions[$this->rtOptions['style']."_style_css"]);
        echo "</style>\n";
        echo "<!--$this->plugin_name End -->\n";
    }
   
    function generate_wrt_widget($args)
    {
        extract($args);
        {
            $options = $this->rtOptions;
           
            $title = $options['title'];
            $postsnum =intval($options['postsnum']);   
            $tagsnum = intval($options['tagsnum']);
           
            if(!($postsnum>0&&$tagsnum>0))return;
           
            echo "<!--$this->plugin_name $this->plugin_version ($this->plugin_uri) Begin -->\n";
            echo $before_widget;
            echo $before_title.$title. $after_title;
 
            $sdate=$this->getRecentPostDate($postsnum);
           
            echo "<ul class='recent-tags'>";
            if($options['style']=='cloud')
            {   
                $rts=$this->getRecentTagCloud($tagsnum, $sdate, 3);   
                foreach ($rts as $lpterm)
                {
                ?>
                    <li><a class="S<?php echo $lpterm['slevel']; ?>" href="<?php echo $lpterm['link']; ?>" title="View all posts tagged with <?php echo $lpterm['name'];?>"><?php echo $lpterm['name'];?></a></li>
                <?php
                }
                echo "</ul>";
            }
            else
            {
                $rts=$this->getRecentTagNameLinks($tagsnum, $sdate);   
                echo "<ul class='recent-tags'>";
                foreach ($rts as $lpterm)
                {
                ?>
                    <li><a href="<?php echo $lpterm['link']; ?>" title="View all posts tagged with <?php echo $lpterm['name'];?>"><?php echo $lpterm['name'];?></a></li>
                <?php
                }
            }
            echo "</ul>";
            echo $after_widget;
            echo "<!--$this->plugin_name End -->\n";
        }
    }
 
    function post_tag_update_count($terms)
    {
        global $wpdb;
        $msg="";
        foreach ( $terms as $term )
        {
            if(!$this->tagcount_update_log[$term])
            {
                $this->tagcount_update_log[$term]=array();
 
                $rec=$wpdb->get_row($wpdb->prepare("SELECT count, term_id FROM $wpdb->term_taxonomy WHERE term_taxonomy_id = %d", $term ));
                if(!$rec) continue;
 
                $oldcount=$rec->count;
                $term_id=$rec->term_id;
            }
            else
            {
                $oldcount=$this->tagcount_update_log[$term]['oldcount'];
                $term_id=$this->tagcount_update_log[$term]['term_id'];
            }
 
            $newcount = $wpdb->get_var($wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->term_relationships, $wpdb->posts WHERE $wpdb->posts.ID = $wpdb->term_relationships.object_id AND post_status = 'publish' AND post_type = 'post' AND term_taxonomy_id = %d", $term ) );
            //$wpdb->update($wpdb->term_taxonomy, compact( 'count' ), array( 'term_taxonomy_id' => $term ));
 
            $this->tagcount_update_log[$term]=array(
            'oldcount'=>intval($oldcount),
            'newcount'=>intval($newcount),
            'term_id'=>intval($term_id)
            );
        }
        //call_user_func($this->post_tag_update_count_callback, $terms);
    }
 
    function check_tagcount_update_log($post_id=0, $post=null)
    {
        if(!($post_id > 0))return;
        if(!$post || 'publish' != $post->post_status)return;
       
        global $wpdb;
        foreach ($this->tagcount_update_log as $term_taxonomy_id=>$termArr)
        {
            if($termArr['oldcount']!=$termArr['newcount'])
            {
                $v=$wpdb->update($wpdb->term_taxonomy, array('count'=>$termArr['newcount']), array( 'term_taxonomy_id' => $term_taxonomy_id ));
                //file_put_contents(dirname(__File__)."/".$term_taxonomy_id,var_export($termArr,true));
                $this->updatetagstat($termArr['term_id'], $termArr['newcount']-$termArr['oldcount']);
            }
        }
        $this->tagcount_update_log=array();
    }
 
    function updatetagstat($term_id=0, $countchange=0, $timestamp=null)
    {
        $term_id=intval($term_id);
        $countchange=intval($countchange);
       
        global $wpdb;
        if(!($term_id>0) || $countchange==0 ) return;
 
        if(!$timestamp)$timestamp=time();
        if(!is_int($timestamp))$timestamp=strtotime($timestamp);
 
        $today = date("Ymd", $timestamp);
        $tomorrow =date("Ymd", mktime(0, 0, 0, date("m",$timestamp)  , date("d",$timestamp)+1, date("Y",$timestamp)));
 
        $sql="select wpt_id, count from $this->wptTable where term_id='$term_id' and inc_date>='$today' and inc_date<'$tomorrow'";
        $rec=$wpdb->get_row($sql);
       
        $sql="";
        if($rec)
        {
            $recid=$rec->wpt_id;       
            if($countchange < 0)
            {
                if($countchange < -$rec->count)
                {
                    $countchange = -$rec->count;
                }
            }
            $sql="update $this->wptTable set count=count + ($countchange) where wpt_id ='$recid'";
        }
        else if($countchange > 0)
        {
            $sql="insert into $this->wptTable (term_id,count,inc_date) values ('$term_id','$countchange','$today')";
        }
        if($sql)$wpdb->query($sql);
    }
 
    function deletetagstat($term=0, $tt_id=0, $taxonomy=0)
    {
        global $wpdb;
        if(!($term > 0))return;
        $sql="delete from $this->wptTable where term_id='$term'";
        $wpdb->query($sql);
    }
 
    function install()
    {
        global $wpdb;
        $wptTable=$this->wptTable;
 
        if($wpdb->get_var("show tables like '$wptTable'") != $wptTable) {
 
            $sql="CREATE TABLE {$wptTable}
                (
                    wpt_id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
                    term_id BIGINT(20) UNSIGNED NOT NULL,
                    count BIGINT(20) UNSIGNED default '0',
                    inc_date DATETIME NOT NULL default '0000-00-00 00:00:00',
                    PRIMARY KEY  (wpt_id),
                    INDEX inc_date (inc_date),
                    INDEX term_id (term_id)
                )";
 
            $wpdb->query($sql);           
            $this->preRtdata(10);
            //file_put_contents(dirname(__File__)."/active",$wpdb->query($sql));
        }
    }
 
    function preRtdata($num)
    {   
        if($num<=0)return;
        set_time_limit(0);
        global $wpdb;
        $termArr=$this->getTagsInRecentPosts($num);
        $lastTerm=$termArr[sizeof($termArr)-1];
        $sql="Delete from $this->wptTable where inc_date < '{$lastTerm['date']}'";
        $wpdb->query($sql);
        foreach ($termArr as $term)
        {
            $this->updatetagstat($term['term_id'], 1, $term['date']);
        }
    }
   
    function getRecentTags($limit, $days)
    {       
        global $wpdb;
        $where="";
        if( is_int($days) && $days > 0)
        {
            $mday =date("Ymd", mktime(0, 0, 0, date("m")  , date("d")-$days, date("Y")));
            $where=" WHERE inc_date >= '$mday' ";
        }
        else if( is_object($days) && $days->post_date)
        {
            $days=strtotime($days->post_date);
            $mday=date("Ymd", mktime(0, 0, 0, date("m",$days)  , date("d",$days), date("Y",$days)));
            $where=" WHERE inc_date >= '$mday' ";
        }
        $sql= "SELECT sum(count) as sum , t.term_id, name FROM $this->wptTable As s INNER JOIN $wpdb->terms As t on s.term_id=t.term_id $where GROUP BY term_id ORDER BY sum DESC LIMIT 0, $limit";
        $terms = $wpdb->get_results($sql);
        return $terms;
    }
 
    function getRecentTagNameLinks($limit, $days)
    {
        $res=array();
        $terms=$this->getRecentTags($limit, $days);
        foreach ($terms as $term)
        {
            $res[] = array(
            "id"=>$term->term_id,
            "name"=>$term->name,
            "link"=>clean_url(get_tag_link($term->term_id)),
            "sum"=>$term->sum
            );
        }
        return $res;
    }
 
    function cmplp($a, $b)
    {
        return strcmp($a["name"], $b["name"]);
    }
 
    function getRecentTagCloud($limit, $days, $levelcount)
    {
        $lpterms=$this->getRecentTagNameLinks($limit, $days);
 
        $lpsize=sizeof($lpterms);
        $lpStep=floor($lpsize/$levelcount);
        $lpfp=0;
        $lplevel=$levelcount;
 
        $minsum=intval($lpterms[$lpsize-1]['sum'])-1;
        $maxsum=intval($lpterms[0]['sum']);
 
        foreach ($lpterms as $key => $lpterm)
        {
            $lpterms[$key]['slevel']=ceil(((floatval($lpterm['sum']))-$minsum)/($maxsum-$minsum)*$levelcount);
            $lpterms[$key]['level']=$lplevel;
            $lpfp++;
            if($lpfp == $lpStep)
            {
                $lplevel--;
                $lpfp=0;
            }
        }
 
        usort($lpterms, array(&$this, 'cmplp' ));
        return $lpterms;
    }
 
    function cleartagstat($days)
    {
        global $wpdb;
        $mday =date("Ymd", mktime(0, 0, 0, date("m")  , date("d")-$days, date("Y")));
        $sql = "delete FROM $this->wptTable WHERE inc_date < '$mday' ";
        return $wpdb->query($sql);
    }
   
    function getRecentPostDate($num)
    {
        global $wpdb, $tableposts;   
        $q = "SELECT post_date FROM $tableposts WHERE post_status = 'publish' AND post_type = 'post' ORDER BY post_date DESC limit $num, 1";
        $res= $wpdb->get_results($q);
        return $res[0];
    }
   
    function getTagsInRecentPosts($num)
    {
        global $wpdb, $tableposts;   
        $q = "SELECT ID, post_date FROM $tableposts WHERE post_status = 'publish' AND post_type = 'post' ORDER BY post_date DESC limit $num";
        $res= $wpdb->get_results($q);
        $termIdArr=array();
        foreach ($res as $post)
        {     
            $tags = get_the_tags($post->ID);
            if ($tags && is_array($tags))
            {
                foreach ($tags as $tag)
                {
                    $termIdArr[]= array(
                        "term_id"=>$tag->term_id,
                        "date"=>$post->post_date
                    );               
                }
            }
        }       
        return $termIdArr;
    }
}
endif;
 
$recentTags= & new RecentTags();
register_activation_hook(__File__, array($recentTags,"install"));
?>

Да и вообще подскажите пожалуйста какие нибудь решения на ваш взшляд для вывода самых актуальных и популярных "тем".
 
Если тебе надо распечатать виждет в контенте по шорттегу, можешь провернуть следующее:
PS код приблизительный, правильность не гарантирую
1) Вставить в класс два метода:
PHP:
function my_function_cntnt_callback($matches) {
    ob_start();
    // Вызов этого метода выдает содержание виджета
    $this->generate_wrt_widget(array(/*Параметры*/));
    return ob_get_clean();
}
 
function my_function_cntnt($content) {
    return preg_replace_callback('/\[mytags\]/i',array(&$this,'my_function_cntnt_callback'),$content);
}

2) В конструктор класса добавить:
PHP:
add_filter('the_content', array(&$this,'my_function_cntnt'));

Как это работает?
В контенте, если вставить [mytags], оно заменится на твой виждет.
 
PHP:
function my_function_cntnt($content) {
    return preg_replace_callback('/\[mytags\]/i',array(&$this,'my_function_cntnt_callback'),$content);
}

2) В конструктор класса добавить:
PHP:
add_filter('the_content', array(&$this,'my_function_cntnt'));

Как это работает?
В контенте, если вставить [mytags], оно заменится на твой виждет.



Зачем такой костыль? Почему просто не повесить шорткод на первую функцию:
PHP:
add_shortcode('mytags', array($this, my_function_cntnt_callback'));
 
Зачем такой костыль? Почему просто не повесить шорткод на первую функцию:
PHP:
add_shortcode('mytags', array($this, my_function_cntnt_callback'));
Да, так заметно проще... Видимо, я поклонник регулярок...
 
PHP:
add_shortcode('mytags', array($this, 'my_function_cntnt_callback'));
Не могу повесить на него шорткод, выдаёт ошибку.
Да и к тому же вопрос - а если повесить этот шорткод на первую функцию, то он будет выводить именно конечный результат плагина?
То есть не будет ли он выводит панель настройки этого плагина ? :)
 
PHP:
add_shortcode('mytags', array($this, 'my_function_cntnt_callback'));
Не могу повесить на него шорткод, выдаёт ошибку.
Вы пропустили амперсант & перед $this, правильно:
PHP:
add_shortcode('mytags', array(&$this, 'my_function_cntnt_callback'));
 
Вы пропустили амперсант & перед $this, правильно:
Да я сделал это, просто забыл здесь вставить :)
Но я только сейчас заметил что плагин даже в форме виджета не рабоатет к сожалению, а ведь функция очень полезная, многие искали.
Думаю попытаться найти его ошибку.

Не могу исправить ошибку.
Дебаггер выдаёт - Notice: Undefined offset: 0 in *\www\wp-content\plugins\wp-recent-tags\recent-tags.php on line 482

Line 482 - это выделенный.

PHP:
        function getRecentPostDate($num)
    {
        global $wpdb, $tableposts;
        $q = "SELECT post_date FROM $tableposts WHERE post_status = 'publish' AND post_type = 'post' ORDER BY post_date DESC limit $num, 1";
        $res= $wpdb->get_results($q);
        return $res[0];. // line 482
    }

Если у кого есть идеи относительно альтернативных методов пишите пожалуйста , думаю многим поможете.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху