如何在自定义帖子类型中显示最常查看的帖子

时间:2015-05-09 12:06:52

标签: php wordpress

我正在使用keremiya主题进行wordpress。如果“most_viewed”选项打开,我试图在我的自定义帖子类型中显示我观看次数最多的帖子。我的自定义帖子类型的名称是watch。如何使用我当前的代码执行此操作?我还使用一个名为wp-post views的插件来显示侧边栏中的视图。这是我的查询。

    <?php if(get_option('most_viewed') == 'On'): ?>
    <div class="sidebar-right">
    <h2><?php echo get_option('my_title'); ?></h2>
    <div class="fimanaortala">
    <?php $tavsayi = get_option('keremiya_tavsiyesayi'); $tavkat = get_option('keremiya_tavsiyekat');?>
    <?php query_posts('showposts='.$tavsayi.'&v_orderby=desc&cat='.$tavkat.'') ?>
    <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
    <div class="filmana">
        <div class="filmsol">
        <?php keremiya_resim('80px', '70px', 'izlenen-resim'); ?>
        </div>
        <div class="filmsag">
            <div class="filmsagbaslik">
            <a href="<?php the_permalink() ?>"><?php the_title(); ?></a>
            </div>
            <div class="filmsagicerik">
            <?php if(function_exists('the_views')) { the_views(); echo " "; } ?>
            <p><?php nezaman_yazildi(); ?></p>
            </div>
            <div class="filmizleme">
            <a href="<?php the_permalink() ?>"><img src="<?php bloginfo('template_directory'); ?>/images/filmizle.png" alt="film izle" height="21" width="61" /></a>
            </div>
        </div>
    </div>
    <?php endwhile; else: ?>
    <?php endif; ?>
    <?php wp_reset_query(); ?>
    </div>
</div>

1 个答案:

答案 0 :(得分:2)

您的解决方案(或至少尝试)基于一个名为WP-PostViews的插件,我不知道。所以,我无法真正帮助你。但是,如果没有此插件或任何其他插件,我可以帮助您解决问题。所以我们走了:

Wordpress有一些名为metadata的东西。从这个非常自己的链接:

  

Metadata API是一种简单且标准化的方法,用于检索和操作各种WordPress对象类型的元数据。对象的元数据由简单的键值对表示。对象可能包含多个共享相同键的元数据条目,并且仅在其值上有所不同。

这意味着您可以为自定义帖子类型创建包含已查看次数的元数据。为此,我们创建了一个函数:

<?php
    function set_views($post_ID) {
        $key = 'views';
        $count = get_post_meta($post_ID, $key, true); //retrieves the count

        if($count == ''){ //check if the post has ever been seen

            //set count to 0
            $count = 0;

            //just in case
            delete_post_meta($post_ID, $key);

            //set number of views to zero
            add_post_meta($post_ID, $key, '0');

        } else{ //increment number of views
            $count++;
            update_post_meta($post_ID, $key, $count);
        }
    }

    //keeps the count accurate by removing prefetching
    remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);
?>

在给定帖子ID的情况下,每次查看帖子时,都会增加一个计数器。当然,我们必须在代码中的某处调用此函数,以便它实际运行。您可以通过两种方式执行此操作:您可以在单个模板上调用此函数(我相信称为single-watch.php),也可以添加简单的跟踪器。我赞成第二个选项,因为它可以保持你的单个帖子循环清洁。您可以通过这种方式实现此类跟踪:

<?php
    function track_custom_post_watch ($post_ID) {
        //you can use is_single here, to track all your posts. Here, we're traking custom post 'watch'
        if ( !is_singular( 'watch') ) return; 

        if ( empty ( $post_ID) ) {

            //gets the global post
            global $post; 

            //extracts the ID
            $post_ID = $post->ID;    
        }

        //calls our previously defined methos
        set_views($post_ID);
    }
    //adds the tracker to wp_head.
    add_action( 'wp_head', 'track_custom_post_watch');
?>

你去吧。现在,WordPress会检查用户是否正在访问与 watch 单个帖子相对应的页面。如果是,则递增计数器。

现在唯一剩下的就是查询视图数量最多的帖子。使用WP_Query可以轻松实现这一点。创建循环时,请执行以下操作:

<?php
    $query = new WP_Query( array(
            'post_type'     => 'watch', //your post type
            'posts_per_page' => 1, 
            'meta_key'      => 'views', //the metakey previously defined
            'orderby'       => 'meta_value_num',
            'order'         => 'DESC'
        )
    );

    while ($query->have_posts()) {
        $query->the_post();
        //whatever code you want
    }
?>

我保留了对PHP的回答,因此您可以适应您的加价需求。我还假设你的post-type确实叫做 watch 。我希望这一切对你有所帮助。如果您想以稍微不同的方式查询帖子,建议您阅读WP_Query文档。欢呼声。