如何获取WordPress文章列表页ID?自定义元框元数据设置遇阻
解决WordPress文章列表页无法获取自身ID的问题
兄弟,我太懂你这个坑了!之前我也在自定义SEO元框的时候踩过一模一样的雷——列表页里拿ID总是拿到第一篇文章的,根本没法调用自己加的元数据。别急,咱们分场景来解决:
场景1:你的列表页是自定义页面(比如手动创建的「博客」页面)
这种情况下,问题出在主循环会覆盖当前页面的$post对象。进入文章循环后,$post会指向第一篇文章,所以直接用get_the_ID()拿到的是文章ID,不是页面本身的。
解决办法很简单:在循环开始前先把页面ID存起来:
// 先全局调用$post对象,保存当前页面ID global $post; $list_page_id = $post->ID; // 这里拿到的就是列表页本身的ID // 之后再正常启动文章循环 if ( have_posts() ) : while ( have_posts() ) : the_post(); // 输出文章内容的代码 the_title(); the_excerpt(); endwhile; endif; // 现在就可以用保存的ID获取自定义元数据了 $custom_meta_desc = get_post_meta( $list_page_id, '你的元描述键名', true ); $custom_meta_keywords = get_post_meta( $list_page_id, '你的关键词键名', true );
场景2:列表页是分类/标签/日期这类系统归档页
这类页面不是Post类型,属于「术语(Term)」,本身没有Post ID,所以你需要给Term添加自定义元框,用Term Meta来存储数据,而不是Post Meta。
第一步:给分类/标签添加自定义元框
把这段代码加到主题的functions.php里:
// 给分类添加自定义SEO元框 function add_term_seo_meta_box() { // 要给标签加的话,把'category'换成'post_tag' add_meta_box( 'term_seo_meta', '自定义SEO设置', 'render_term_seo_meta_box', 'category', 'normal', 'high' ); } add_action( 'add_meta_boxes', 'add_term_seo_meta_box' ); // 渲染元框的HTML内容 function render_term_seo_meta_box( $term ) { // 获取已保存的Term元数据 $term_meta_desc = get_term_meta( $term->term_id, 'term_seo_desc', true ); $term_meta_keywords = get_term_meta( $term->term_id, 'term_seo_keywords', true ); ?> <p> <label for="term_seo_desc">元描述:</label><br> <textarea name="term_seo_desc" id="term_seo_desc" rows="3" cols="50"><?php echo esc_textarea( $term_meta_desc ); ?></textarea> </p> <p> <label for="term_seo_keywords">关键词:</label><br> <input type="text" name="term_seo_keywords" id="term_seo_keywords" value="<?php echo esc_attr( $term_meta_keywords ); ?>" size="50"> </p> <?php } // 保存Term元数据 function save_term_seo_meta( $term_id ) { if ( isset( $_POST['term_seo_desc'] ) ) { update_term_meta( $term_id, 'term_seo_desc', sanitize_textarea_field( $_POST['term_seo_desc'] ) ); } if ( isset( $_POST['term_seo_keywords'] ) ) { update_term_meta( $term_id, 'term_seo_keywords', sanitize_text_field( $_POST['term_seo_keywords'] ) ); } } // 分类编辑后触发保存,标签的话换成'edited_post_tag' add_action( 'edited_category', 'save_term_seo_meta' );
第二步:在归档模板里调用元数据
在你的分类/标签模板(比如category.php、tag.php)里,用当前Term的ID获取数据:
// 获取当前归档Term的ID $current_term_id = get_queried_object_id(); // 取出自定义元数据 $custom_meta_desc = get_term_meta( $current_term_id, 'term_seo_desc', true ); $custom_meta_keywords = get_term_meta( $current_term_id, 'term_seo_keywords', true );
场景3:列表页是设置里指定的「博客首页」
WordPress会把这个页面当成归档页处理,循环同样会覆盖$post对象,这时候要通过系统选项来获取页面ID:
// 获取博客首页的页面ID $blog_home_id = get_option( 'page_for_posts' ); // 调用自定义元数据 $custom_meta_desc = get_post_meta( $blog_home_id, '你的元描述键名', true ); $custom_meta_keywords = get_post_meta( $blog_home_id, '你的关键词键名', true );
核心逻辑就是:区分列表页的类型,不要在主循环里直接拿ID,提前保存或者用对应类型的API获取ID。
内容的提问来源于stack exchange,提问作者Ryan Coolwebs
相关产品推荐
相关产品推荐

