通过wordpress page.php模板中的类别分页

时间:2014-12-06 23:03:26

标签: wordpress pagination categories

我最初设置菜单来设置类别,但这限制了我对菜单结构中类别的使用。

理想情况下,我更喜欢使用页面模板。

所以我创建了一个新的页面模板'page-for-cat.php'并将模板命名为'category of page'。

我将此查询添加到页面

<?php
query_posts('category_name=my-cat');
while (have_posts()) : the_post();
the_content();
endwhile;
?>

我用这篇文章作为参考

然后我在wordpress中创建一个新页面并将页面模板设置为“类别页面”。我将页面称为“测试页面”。

然后我将'测试页'wordpress页面添加到菜单结构中。

到目前为止,非常好......

我无法工作的是前一页和下一页的分页,以便使用此设置。

我哪里错了,我错过了什么?

由于

1 个答案:

答案 0 :(得分:0)

你永远不应该使用query_posts

  

注意:此功能不适用于插件或主题。如后面所述,有更好的,更高性能的选项来改变主查询。 query_posts()是一种过于简单化和有问题的方法来修改页面的主要查询,方法是用新的查询实例替换它。它是低效的(重新运行SQL查询)并且在某些情况下会彻底失败(特别是在处理帖子分页时)。

这是我最近在WPSE上发表的一篇文章。此模板允许您从下拉列表中选择要在页面上显示的类别。什么是好的,你有一个模板用于所有页面,而不是每个类别一个页面模板。这是该页面和帖子的分页

据我所知,您正在寻找一个页面模板,您可以在页面管理添加/编辑屏幕中的页面属性下设置,并自动为其分配一个类别。

这是一个完全相同的页面模板。您可以在后端创建一个新页面,将此模板分配给页面,然后从后端设置一个特定的类别。

以下是它的工作方式

我已根据digitalraindrops的教程调整了此模板,您可以查看所提供的链接。我对它进行了一些修改,以便在二十四个上工作。我还删除了原始WP_Query,因为它的使用方式实际上与执行普通query_posts查询相同,不应该使用它。

  

注意:此功能不适用于插件或主题。如后面所述,有更好的,更高性能的选项来改变主查询。 query_posts()是一种过于简单化和有问题的方法来修改页面的主要查询,方法是用新的查询实例替换它。它是低效的(重新运行SQL查询)并且在某些情况下会彻底失败(特别是在处理帖子分页时)。

在开始之前应该注意,你也可以创建一个合适的category.php模板,创建一个自定义菜单并将所需的类别添加到菜单中。您还应该注意,您可以使用类别名称作为页面slug,但不能有这些页面的任何子页面,干扰并打破{{3} }

要完成我们需要的所有内容,您需要创建一个自定义元框,当选择特定模板时,该元框将添加到页面添加/编辑屏幕。此元框将用于选择将用于所选页面的类别。您还可以设置自定义posts_per_page并对帖子进行排序。这是添加自定义元框的代码。将这些代码添加到functions.php或任何与函数相关的文件

<?php
/**-----------------------------------------------------------------------------
 *
 *  Add a post metabox with options to the admin page screen.
 *  After selcting the page-pop.php template as a page template,
 *  this metabox will appear in the admin page screen.
 *  From here you can choose which category's posts to display
 *  and how the posts will be displayed on the page
 *
 *  @package WordPress
 *  @subpackage Twenty_Fourteen
 *  @since Twenty Fourteen 1.0
 *
*------------------------------------------------------------------------------*/

/**-----------------------------------------------------------------------------
 *
 *  1. Only add meta boxes for the pop template
 *
 *  @since Twenty Fourteen 1.0
 *
*------------------------------------------------------------------------------*/
add_action('admin_init', 'pietergoosen_add_pop_meta_box');

function pietergoosen_add_pop_meta_box(){   
    $post_id = isset( $_GET['post'] ) ? $_GET['post'] : 0 ;
    if($post_id) { 
        $template_file = get_post_meta($post_id,'_wp_page_template',TRUE);
        if ($template_file == 'page-pop.php') { 
            add_meta_box('pop_meta_box', __( 'Page of Posts with the same name', 'pietergoosen' ), 'pietergoosen_pop_meta_options', 'page', 'side', 'core');
        } else {
            $meta = get_post_meta($post_id, '_cat_id', true);
            if( $meta ) {
                pietergoosen_pop_update_post_meta($post_id, '_cat_id', '');
                pietergoosen_pop_update_post_meta($post_id, '_page_title', '');
                pietergoosen_pop_update_post_meta($post_id, '_posts_title', '');
                pietergoosen_pop_update_post_meta($post_id, '_order_by', '');
                pietergoosen_pop_update_post_meta($post_id, '_asc', '');
                pietergoosen_pop_update_post_meta($post_id, '_post_count', '');
                pietergoosen_pop_update_post_meta($post_id, '_days', '');
                remove_meta_box( 'pop_meta_box', 'page', 'side' );
            }
        }
    }
    add_action('save_post', 'pietergoosen_pop_update_post_meta_box');
}

/**-----------------------------------------------------------------------------
 *
 *  2. Built the list to display the options in the metabox
 *
 *  @since Twenty Fourteen 1.0
 *
*------------------------------------------------------------------------------*/
$order_list = array(
    'none' => array( 'value' => 'none','label' => 'None' ),
    'id' => array( 'value' => 'ID','label' => 'Post ID' ),
    'author' => array( 'value' => 'author','label' => 'Author' ),
    'title' => array( 'value' => 'title','label' => 'Post Title' ),
    'date' => array( 'value' => 'date', 'label' => 'Post Date'  ),
    'modified' => array( 'value' => 'modified','label' => 'Modified Date' ),
    'parent' => array( 'value' => 'parent','label' => 'Parent Post' ),
    'rand' => array( 'value' => 'rand','label' => 'Random' ),
    'comment_count' => array( 'value' => 'comment_count','label' => 'Comment Count' ),
    'menu_order' => array( 'value' => 'menu_order','label' => 'Menu Order' ),
);

$sort = array(
    'DESC' => array( 'value' => 'DESC','label' => 'Descending' ),
    'ASC' => array( 'value' => 'ASC','label' => 'Ascending' ),
); 

function pietergoosen_pop_meta_options(){

    $post_id =  !empty($_GET['post']) ? $_GET['post'] : 0;
    if( !$post_id ) return;

    $template_file = get_post_meta($post_id,'_wp_page_template',TRUE);
    if ($template_file != 'page-pop.php') return;

    global $order_list,$post_styles,$sort;
    $categories = get_categories();

    //Check if we have values
    $post_meta=array();
    $post_meta = get_post_meta( $post_id,false );

    $cat_id = isset( $post_meta['_cat_id'] ) ? $post_meta['_cat_id'][0] : 1;
    $page_title = isset( $post_meta['_page_title'] ) && $post_meta['_page_title'] ? $post_meta['_page_title'][0] : '';
    $posts_title = isset( $post_meta['_posts_title'] ) && $post_meta['_posts_title'] ? $post_meta['_posts_title'][0] : '';
    $order_by = isset( $post_meta['_order_by'] ) ? $post_meta['_order_by'][0] : 'date';
    $asc = isset( $post_meta['_asc'] ) ? $post_meta['_asc'][0] : 'DESC';
    $post_count = isset( $post_meta['_post_count'] ) ? $post_meta['_post_count'][0] : get_option('posts_per_page');
    if(!$post_count || !is_numeric( $post_count )) $post_count = get_option('posts_per_page');
    $days = isset( $post_meta['_days'] ) ? $post_meta['_days'][0] : '0';
    if($days && !is_numeric( $days )) $days = '0';
    ?>

    <!-- Sart the meta boxes -->
    <div class="inside">
    <p><label><strong><?php _e( 'Page Title', 'pietergoosen' ); ?></strong></label></p> 
    <input id="_posts_title" name="_posts_title" type="text" style="width: 98%;" value="<?php echo $posts_title; ?>"/>  

    <p><label><strong><?php _e( 'Post Title', 'pietergoosen' ); ?></strong></label></p> 
    <input id="_page_title" name="_page_title" type="text" style="width: 98%;" value="<?php echo $page_title; ?>"/>

    <p><label><strong><?php _e( 'Category', 'pietergoosen' ); ?></strong></label></p>
    <select id="_cat_id" name="_cat_id">
<?php 
    //Category List
    foreach ($categories as $cat) :
        $selected = ( $cat->cat_ID == $cat_id ) ? ' selected = "selected" ' : '';
        $option = '<option '.$selected .'value="' . $cat->cat_ID;
        $option = $option .'">';
        $option = $option .$cat->cat_name;
        $option = $option .'</option>';
        echo $option;
    endforeach;
?>
    </select>

    <p><label><strong><?php _e( 'Sort by', 'pietergoosen' )?></strong></label></p>
    <select id="_order_by" name="_order_by">
<?php 
    foreach ($order_list as $output) :
        $selected = ( $output['value'] == $order_by ) ? ' selected = "selected" ' : '';
        $option = '<option '.$selected .'value="' . $output['value'];
        $option = $option .'">';
        $option = $option .$output['label'];
        $option = $option .'</option>';
        echo $option;
    endforeach;
?>
    </select>       

    <p><label><strong><?php _e( 'Order', 'pietergoosen' )?><strong></label></p>
    <select id="_asc" name="_asc">
<?php 
    foreach ($sort as $output) :
        $selected = ( $output['value'] == $asc ) ? ' selected = "selected" ' : '';
        $option = '<option '.$selected .'value="' . $output['value'];
        $option = $option .'">';
        $option = $option .$output['label'];
        $option = $option .'</option>';
        echo $option;
    endforeach;
?>
    </select>

    <p><strong><label><?php _e( 'Posts per Page', 'pageofposts' ); ?><strong></label></p>
    <input id="_post_count" name="_post_count" type="text" value="<?php echo $post_count; ?>" size="3" />

    <p><strong><label><?php _e( 'Posts in the last days', 'pageofposts' ); ?><strong></label></p>
    <input id="_days" name="_days" type="text" value="<?php echo $days; ?>" size="3" />
    </div>
    <!-- End page of posts meta box -->
    <?php
}
function pietergoosen_pop_update_post_meta_box( $post_id ){

    if ( empty( $_POST ) ) {
        return;
    } else {
        $template_file = get_post_meta($post_id,'_wp_page_template',TRUE);
        if ($template_file != 'page-pop.php') return;

        if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
            return $post_id;
        } else {
            if ( $_POST['post_type'] == 'page' ) {
                if ( !current_user_can( 'edit_page', $post_id ) )
                  return $post_id;
            } else {
                if ( !current_user_can( 'edit_post', $post_id ) )
                  return $post_id;
            }
            $meta = isset( $_POST['_cat_id'] ) ? $_POST['_cat_id'] : 1;         
            pietergoosen_pop_update_post_meta($post_id, '_cat_id', $meta);
            $meta = isset( $_POST['_page_title'] ) ? $_POST['_page_title'] : '';            
            pietergoosen_pop_update_post_meta($post_id, '_page_title', $meta);
            $meta = isset( $_POST['_posts_title'] ) ? $_POST['_posts_title'] : '';          
            pietergoosen_pop_update_post_meta($post_id, '_posts_title', $meta);
            $meta = isset( $_POST['_order_by'] ) ? $_POST['_order_by'] : 'date';            
            pietergoosen_pop_update_post_meta($post_id, '_order_by', $meta);
            $meta = isset( $_POST['_asc'] ) ? $_POST['_asc'] : 'DESC';
            pietergoosen_pop_update_post_meta($post_id, '_asc', $meta);
            $meta = isset( $_POST['_post_count'] ) ? $_POST['_post_count'] : get_option('posts_per_page');
            pietergoosen_pop_update_post_meta($post_id, '_post_count', $meta);
            $meta = isset( $_POST['_days'] ) ? $_POST['_days'] : 0;
            pietergoosen_pop_update_post_meta($post_id, '_days', $meta);
            return;
        }
    }
}

function pietergoosen_pop_update_post_meta($post_id, $key, $data) {
    $post_meta = get_post_meta($post_id, $key, true);
    if( $data != '' && $post_meta != $data) {
        update_post_meta($post_id, $key, $data);
    } elseif ( $post_meta != '' && $data == '' ) {
        delete_post_meta($post_id, $key);
    }
}
?>

现在为页面模板。在根目录中创建一个文件并将其命名为page-pop.php。你必须打电话给你的模板。如果您需要重命名,请检查上面的代码并将page-pop.php的所有实例更改为您选择的模板名称

第一部分将从元框中回调所有已保存的值。这些值将反馈到您的自定义WP_Query,以根据类别回复所有帖子。

第一个循环是您的普通页面模板循环,您可以使用它在页面添加/编辑屏幕中显示添加到WYSIWYG编辑器的内容。第二个循环/查询是将返回您的帖子的查询。你应该注意到这里的所有标记都是默认的二十四个主题,你需要修改它以适应你的主题。

以下是应放入page-pop.php模板

的代码
<?php
/**
 * Template Name: Page of Posts
 */
get_header(); ?>

<?php
    //See if we have any values
    $post_meta          =   array();
    $post_meta          =   get_post_meta( $post->ID,false );
    $catid              =   isset( $post_meta['_cat_id'] ) ? $post_meta['_cat_id'][0] : 1;
    $page_title         =   isset( $post_meta['_page_title'] ) ? $post_meta['_page_title'][0] : '';
    $posts_title        =   isset( $post_meta['_posts_title'] ) ? $post_meta['_posts_title'][0] : '';
    $orderby            =   isset( $post_meta['_order_by'] ) ? $post_meta['_order_by'][0] : 'date';
    $asc                =   isset( $post_meta['_asc'] ) ? $post_meta['_asc'][0] : 'DESC';
    $list_style         =   isset( $post_meta['_list_style'] ) ? $post_meta['_list_style'][0] : 'default';  
    $post_count         =   isset( $post_meta['_post_count'] ) ? $post_meta['_post_count'][0] : get_option('posts_per_page');

    if(!$post_count || !is_numeric( $post_count )) 
        $post_count = get_option('posts_per_page');
    $days = isset( $post_meta['_days'] ) ? $post_meta['_days'][0] : 0;
    if($days && !is_numeric( $days )) 
        $days = 0;
    $do_not_show_stickies = ($list_style == 'default') ? 0 : 1;
?>  

<div id="main-content" class="main-content">

    <div id="primary" class="content-area">
        <div id="content" class="site-content" role="main">

    <!-- Page Title -->
    <?php if( $posts_title ) : ?>
        <article id="posts-title">
            <header class="entry-header">
                <h2 class="entry-title"><?php echo $posts_title; ?></h2>
            </header><!-- .entry-header -->
        </article><!-- #posts-title -->
    <?php endif; ?>

        <?php the_post(); ?>
        <?php global $post;
        if( $post->post_content || $page_title ) : ?>
        <div class="entry-content">
            <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
                <?php if( $page_title ) : ?>
                    <header class="entry-header">
                        <h1 class="entry-title"><?php echo $page_title; ?></h1>
                    </header><!-- .entry-header -->

                <?php endif; ?>
            <?php if( $post->post_content ) : ?>    
                <div class="entry-content">
                    <?php the_content(); ?>
                    <?php wp_link_pages( array( 'before' => '<div class="page-link"><span>' . __( 'Pages:', 'pietergoosen' ) . '</span>', 'after' => '</div>' ) ); ?>
                </div><!-- .entry-content -->
                <footer class="entry-meta">

                </footer><!-- .entry-meta -->
            <?php endif; ?>
            </article><!-- #post-<?php the_ID(); ?> -->
        </div>  
        <?php endif; ?>

<?php 

/**-----------------------------------------------------------------------------
 *
 *  Start our custom query to display category posts
 *
*------------------------------------------------------------------------------*/   
        $paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
        $args = array( 
            'cat'                   => $catid,
            'posts_per_page'        => $post_count,
            'paged'                 => $paged,
            'orderby'               => $orderby,
            'order'                 => $asc,
            'ignore_sticky_posts'   => $do_not_show_stickies,
        );

        if( $days ) {
            function pop_filter_where( $where = '') {
                global $days;
                    $where .= " AND post_date > '" . date('Y-m-d', strtotime('-' .$days .' days')) . "'";
                return $where;
            }
            add_filter( 'posts_where', 'pop_filter_where' );

            $cat_query = new WP_Query($args);
            remove_filter( 'posts_where', 'pop_filter_where' );

        } else {

            $cat_query = new WP_Query($args);

        }           
        // Output
        if ( $cat_query->have_posts() ) :

            $counter = 1; //Starts counter for post column lay out

            // Start the Loop.
            while ( $cat_query->have_posts() ) : $cat_query->the_post(); ?>

                <div class="entry-column<?php echo ( $counter%2  ? ' left' : ' right' ); ?>">

                    <?php get_template_part( 'content', get_post_format() ); ?>

                </div>  

                <?php   

                $counter++; //Update the counter

            endwhile;

                // next_posts_link() usage with max_num_pages
                next_posts_link( 'Older Entries', $cat_query->max_num_pages );
                previous_posts_link( 'Newer Entries' ); 

                wp_reset_postdata();

            else : 

                get_template_part( 'content', 'none' );

        endif; ?>

    </div><!-- #content -->
    </div><!-- #primary -->

    <?php get_sidebar( 'content' ); ?>

</div><!-- #main-content -->

<?php
get_footer();

我希望我能正确理解你,希望这就是你所需要的