WordPress 创建类似存档页的 Page

WordPress Page 页可以创建类似于存档页的数据吗

ChatGPT 说:

是的,WordPress 中的 页面Page)可以像 存档页 一样,展示特定的数据或内容。尽管 PagePost 有着不同的用途和结构,但通过自定义查询和模板,您可以在 页面 上展示类似存档页面的数据。

1. 页面展示文章或自定义内容

虽然页面通常用于显示静态内容,但通过在页面模板中使用 WP_Query,您可以动态地展示一系列文章、分类、标签或自定义内容。

示例:在页面中展示最新的 10 篇文章

可以通过在页面模板中使用 WP_Query 查询并显示文章列表。

<?php
/* Template Name: Latest Posts Page */

get_header();

// 自定义查询:获取最新的 10 篇文章
$args = array(
    'post_type' => 'post',  // 查询常规文章
    'posts_per_page' => 10,  // 每页显示 10 篇文章
);

$query = new WP_Query( $args );

if ( $query->have_posts() ) :
    echo '<ul>';
    while ( $query->have_posts() ) : $query->the_post();
        echo '<li>';
        echo '<a href="' . get_the_permalink() . '">' . get_the_title() . '</a>';
        echo '</li>';
    endwhile;
    echo '</ul>';

    // 分页
    the_posts_pagination();
else :
    echo '<p>没有找到文章。</p>';
endif;

wp_reset_postdata(); // 重置查询

get_footer();

这段代码将创建一个 自定义页面模板,该模板显示最新的 10 篇文章。当您在后台创建页面时,您可以选择这个自定义模板来生成页面内容。

2. 通过自定义分类法(Taxonomy)展示内容

如果您希望在页面中展示特定分类(Category)或标签(Tag)的文章,您也可以使用 WP_Query 来查询与特定分类或标签相关的文章。

示例:在页面中展示某个特定分类的文章

<?php
/* Template Name: Category Posts Page */

get_header();

// 获取特定分类(例如,ID 为 3 的分类)的文章
$args = array(
    'post_type' => 'post',
    'posts_per_page' => 10,
    'category__in' => array( 3 )  // 分类 ID 为 3
);

$query = new WP_Query( $args );

if ( $query->have_posts() ) :
    echo '<ul>';
    while ( $query->have_posts() ) : $query->the_post();
        echo '<li>';
        echo '<a href="' . get_the_permalink() . '">' . get_the_title() . '</a>';
        echo '</li>';
    endwhile;
    echo '</ul>';

    the_posts_pagination();
else :
    echo '<p>没有相关文章。</p>';
endif;

wp_reset_postdata();

get_footer();

3. 展示自定义文章类型(CPT)内容

如果你有自定义文章类型(例如 productportfolio),你也可以通过 WP_Query 查询这些自定义文章类型的内容,并在页面模板中展示。

示例:在页面中展示自定义文章类型 product

<?php
/* Template Name: Product Listings Page */

get_header();

// 获取自定义文章类型 'product' 的文章
$args = array(
    'post_type' => 'product',  // 自定义文章类型
    'posts_per_page' => 10,    // 每页显示 10 个产品
);

$query = new WP_Query( $args );

if ( $query->have_posts() ) :
    echo '<ul>';
    while ( $query->have_posts() ) : $query->the_post();
        echo '<li>';
        echo '<a href="' . get_the_permalink() . '">' . get_the_title() . '</a>';
        echo '</li>';
    endwhile;
    echo '</ul>';

    the_posts_pagination();
else :
    echo '<p>没有找到产品。</p>';
endif;

wp_reset_postdata();

get_footer();

4. 通过 pre_get_posts 修改查询

如果您希望通过某些条件修改页面的查询,可以使用 pre_get_posts 钩子来修改查询参数。例如,您可以在页面加载时展示特定类别的文章。

示例:在页面中展示某个类别的文章

add_action( 'pre_get_posts', function( $query ) {
    // 确保是前端查询且是页面查询
    if ( ! is_admin() && $query->is_main_query() && is_page() ) {
        // 如果页面是 '最新文章' 页(例如 ID 为 5)
        if ( is_page( 5 ) ) {
            $query->set( 'category_name', 'news' );  // 显示 'news' 分类的文章
            $query->set( 'posts_per_page', 5 );     // 每页显示 5 篇文章
        }
    }
} );

5. 显示页面中的其他动态数据

除了文章和自定义文章类型之外,您还可以通过 WP_Query 展示任何自定义查询的数据。例如,显示特定日期范围内的文章、特定作者的文章,或根据其他条件过滤文章。

示例:在页面中展示指定日期范围内的文章

<?php
/* Template Name: Date Range Posts Page */

get_header();

$args = array(
    'post_type' => 'post',
    'posts_per_page' => 10,
    'date_query' => array(
        array(
            'after' => '1 month ago', // 获取过去一个月的文章
        ),
    ),
);

$query = new WP_Query( $args );

if ( $query->have_posts() ) :
    echo '<ul>';
    while ( $query->have_posts() ) : $query->the_post();
        echo '<li>';
        echo '<a href="' . get_the_permalink() . '">' . get_the_title() . '</a>';
        echo '</li>';
    endwhile;
    echo '</ul>';

    the_posts_pagination();
else :
    echo '<p>没有找到相关文章。</p>';
endif;

wp_reset_postdata();

get_footer();

6. 创建静态页面和动态内容的结合

在 WordPress 页面中,你可以将静态内容(例如关于我们、联系我们等页面内容)与动态内容(如文章列表、最新活动等)结合,提供更加丰富的页面内容。

示例:创建页面,包含固定内容和动态查询结果

<?php
/* Template Name: About Us with Latest Posts */

get_header();

// 固定内容部分
echo '<h1>关于我们</h1>';
echo '<p>我们是一家专注于创新和优质服务的公司。</p>';

// 动态查询部分:显示最新的文章
$args = array(
    'post_type' => 'post',
    'posts_per_page' => 5,
);

$query = new WP_Query( $args );

if ( $query->have_posts() ) :
    echo '<h2>最新文章</h2>';
    echo '<ul>';
    while ( $query->have_posts() ) : $query->the_post();
        echo '<li>';
        echo '<a href="' . get_the_permalink() . '">' . get_the_title() . '</a>';
        echo '</li>';
    endwhile;
    echo '</ul>';

    the_posts_pagination();
else :
    echo '<p>没有最新文章。</p>';
endif;

wp_reset_postdata();

get_footer();

总结:

  • 通过 WP_Query:你可以在页面模板中使用 WP_Query 来查询并展示文章、分类、标签、甚至是自定义文章类型。
  • 创建自定义页面模板:通过创建自定义页面模板,可以展示特定的数据或动态内容。
  • 结合静态和动态内容:页面不仅可以包含固定内容,还可以展示动态查询结果,使页面更具灵活性和可扩展性。

通过这些方法,你可以在 WordPress 页面上实现类似存档页的功能,并根据需要展示不同类型的数据。

创建自定义存档页和详情页

是的,您是对的。如果您希望 /custom/ 显示第一页的内容(即 /custom/page/1),您确实需要做一些额外的修改。这样可以确保当用户访问 /custom/ 时,实际上显示的是第一页的内容,而不是404错误或空白页面。

需要修改的地方:

  1. 修改路由规则:确保 /custom/ 被正确地重定向到 custom/page/1/
  2. 处理默认分页:当用户访问 /custom/ 时,实际显示的是第一页的内容。

步骤 1:修改路由规则

我们需要修改路由规则,让 /custom/ 路径指向存档页面,并显示第一页的内容。

function custom_rewrite_rules() {
    // 为存档页面创建自定义路由规则
    add_rewrite_rule( '^custom/page/([0-9]+)/$', 'index.php?custom_page_archive=1&page_num=$matches[1]', 'top' );

    // 为 /custom/ 创建路由规则,默认指向 /custom/page/1/
    add_rewrite_rule( '^custom/?$', 'index.php?custom_page_archive=1&page_num=1', 'top' );

    // 为详情页创建自定义路由规则
    add_rewrite_rule( '^custom/([^/]+)/$', 'index.php?custom_page_slug=$matches[1]', 'top' );
}
add_action( 'init', 'custom_rewrite_rules' );
  • ^custom/?$:这条规则捕获 /custom/,并将其映射到 index.php?custom_page_archive=1&page_num=1,表示 /custom/ 显示第一页的内容。
  • 其他规则保持不变,继续支持分页和详情页。

步骤 2:修改存档页模板逻辑

修改 custom_page_archive_template() 函数,确保如果访问的是 /custom/,就默认显示第一页的内容。

function custom_page_archive_template() {
    if ( get_query_var( 'custom_page_archive' ) ) {
        // 获取当前页码
        $page_num = get_query_var( 'page_num' ) ? intval( get_query_var( 'page_num' ) ) : 1;

        // 获取 WordPress 数据库对象
        global $wpdb;
        $table_name = $wpdb->prefix . 'custom_table';

        // 设置每页显示的数量
        $posts_per_page = 10;
        $offset = ( $page_num - 1 ) * $posts_per_page;

        // 查询自定义表的数据
        $sql = "SELECT * FROM $table_name ORDER BY created_at DESC LIMIT $offset, $posts_per_page";
        $results = $wpdb->get_results( $sql );

        // 判断是否有数据
        if ( $results ) :
            echo '<ul>';
            foreach ( $results as $row ) :
                echo '<li>';
                echo '<a href="' . esc_url( home_url( '/custom/' . $row->slug ) ) . '">' . esc_html( $row->name ) . '</a>';
                echo '</li>';
            endforeach;
            echo '</ul>';

            // 添加分页
            $total_posts = $wpdb->get_var( "SELECT COUNT(*) FROM $table_name" );
            $total_pages = ceil( $total_posts / $posts_per_page );

            if ( $total_pages > 1 ) :
                echo '<div class="pagination">';
                for ( $i = 1; $i <= $total_pages; $i++ ) {
                    echo '<a href="' . esc_url( home_url( '/custom/page/' . $i ) ) . '">' . $i . '</a> ';
                }
                echo '</div>';
            endif;
        else :
            echo '<p>没有数据。</p>';
        endif;

        exit;
    }
}
add_action( 'template_redirect', 'custom_page_archive_template' );
  • 我们仍然使用 get_query_var( 'page_num' ) 来获取当前页码,并且默认页码为 1。
  • 如果没有找到数据(即没有匹配的条目),就显示一个消息。

步骤 3:刷新重写规则

因为我们修改了路由规则,记得刷新重写规则以确保 WordPress 能正确解析新的 URL。您可以通过访问 设置 → 固定链接 并点击 保存更改 来刷新规则,或者通过以下代码在主题激活时刷新重写规则:

function custom_flush_rewrite_rules() {
    custom_rewrite_rules();  // 添加自定义路由规则
    flush_rewrite_rules();   // 刷新重写规则
}
add_action( 'after_switch_theme', 'custom_flush_rewrite_rules' );

步骤 4:创建分页

如果您的数据量较大并且分页链接正确显示,您应该就可以看到类似于以下结构的分页:

html复制编辑<div class="pagination">
    <a href="/custom/page/1">1</a>
    <a href="/custom/page/2">2</a>
    <a href="/custom/page/3">3</a>
</div>

总结

  1. 添加自定义路由规则:使 /custom/ 默认指向 /custom/page/1/,并显示存档页内容。
  2. 修改存档页模板:确保在访问 /custom/ 时会显示第一页的内容。
  3. 刷新重写规则:确保自定义路由规则生效。

这样,访问 /custom/ 时会默认加载第一页的内容,而访问 /custom/page/1//custom/page/2/ 等将继续展示分页数据。同时,您仍然可以通过 /custom/slug/ 访问单条数据的详情页。

如果您希望将 get_header()get_footer() 调用也放到包含的模板文件中,而不是在插件的主逻辑中调用,这也是完全可以实现的。这样,您可以在模板文件中集中处理所有页面渲染逻辑,包括页头、主体内容、页脚等。

方案:

在您的自定义模板文件(如 custom-archive-template.php)中,直接调用 get_header()get_footer(),这样插件的主逻辑文件就只需要负责包含模板文件,不再需要手动调用页头和页脚。

示例代码:

1. custom-archive-template.php(插件中的模板文件)

<?php
// 引入页头
get_header();  // 通过插件加载主题的页头

// 获取 WordPress 数据库对象
global $wpdb;
$table_name = $wpdb->prefix . 'custom_table';

// 获取当前页码
$page_num = get_query_var( 'page_num' ) ? intval( get_query_var( 'page_num' ) ) : 1;

// 设置每页显示的数量
$posts_per_page = 10;
$offset = ( $page_num - 1 ) * $posts_per_page;

// 查询自定义表的数据
$sql = "SELECT * FROM $table_name ORDER BY created_at DESC LIMIT $offset, $posts_per_page";
$results = $wpdb->get_results( $sql );

// 输出页面内容
?>
<div class="custom-archive-content">
    <h1>自定义存档页面</h1>

    <?php if ( $results ) : ?>
        <ul>
            <?php foreach ( $results as $row ) : ?>
                <li>
                    <a href="<?php echo esc_url( home_url( '/custom/' . $row->slug ) ); ?>">
                        <?php echo esc_html( $row->name ); ?>
                    </a>
                </li>
            <?php endforeach; ?>
        </ul>

        <?php
        // 分页
        $total_posts = $wpdb->get_var( "SELECT COUNT(*) FROM $table_name" );
        $total_pages = ceil( $total_posts / $posts_per_page );

        if ( $total_pages > 1 ) :
        ?>
            <div class="pagination">
                <?php for ( $i = 1; $i <= $total_pages; $i++ ) : ?>
                    <a href="<?php echo esc_url( home_url( '/custom/page/' . $i ) ); ?>"><?php echo $i; ?></a>
                <?php endfor; ?>
            </div>
        <?php endif; ?>
    <?php else : ?>
        <p>没有数据。</p>
    <?php endif; ?>
</div>

<?php
// 引入页脚
get_footer();  // 通过插件加载主题的页脚

2. 修改插件代码(functions.php 或插件文件)

function custom_page_archive_template() {
    if ( get_query_var( 'custom_page_archive' ) ) {
        // 包含自定义模板文件
        include( plugin_dir_path( __FILE__ ) . 'custom-archive-template.php' );  // 插件目录中的自定义模板

        exit;  // 确保终止执行以防止 WordPress 加载默认模板
    }
}
add_action( 'template_redirect', 'custom_page_archive_template' );

关键点:

  1. get_header()get_footer() 在模板文件内: 在 custom-archive-template.php 文件中,您可以直接调用 get_header()get_footer(),确保页头和页脚被正确加载。这样您无需在插件的主逻辑文件中处理这些部分。
  2. 简化插件逻辑: 在插件的主逻辑中,我们只需要通过 include() 函数加载自定义模板文件,其他的模板加载(如页头、页脚)由模板文件内部的 get_header()get_footer() 自动处理。
  3. exit 确保终止执行: 使用 exit 终止页面的执行,避免 WordPress 继续加载默认的页面模板。这样,页面的渲染将完全由您的插件模板文件来处理。

总结:

通过将 get_header()get_footer() 放到自定义模板文件中,您将模板逻辑与插件的核心逻辑分离,使代码更清晰、更易于维护。插件的主文件仅负责逻辑控制,模板文件负责所有页面内容的渲染。这种做法可以提高代码的模块化,使得页面结构和内容更易于管理和扩展。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇