WordPress如何让Custom Post Type链接直接跳转至自定义字段附件而非文章页
实现方案
1. 劫持自定义文章类型单页访问,直接跳转附件
直接在主题的functions.php文件,或者自定义代码片段插件中添加以下代码,即可实现用户访问该自定义文章类型的默认详情页时,直接跳转至对应的附件地址:
add_action( 'template_redirect', 'redirect_cpt_to_attachment' ); function redirect_cpt_to_attachment() { // 替换为你自己创建的自定义文章类型别名 $cpt_slug = '替换为你的CPT别名'; // 替换为你附件字段的实际字段名 $attachment_field_key = 'attachment'; if ( is_singular( $cpt_slug ) ) { global $post; $attachment_url = get_post_meta( $post->ID, $attachment_field_key, true ); if ( $attachment_url ) { // 如果字段存储的是附件ID而非URL,替换上面一行为: // $attachment_url = wp_get_attachment_url( get_post_meta( $post->ID, $attachment_field_key, true ) ); wp_redirect( esc_url_raw( $attachment_url ), 301 ); exit; } } }
2. 前端列表标题直接输出附件链接
无需跳转单页中转,直接修改该类型文章的全局链接规则,所有调用WordPress默认文章链接函数的位置都会自动输出附件地址:
add_filter( 'post_type_link', 'change_cpt_permalink_to_attachment', 10, 2 ); function change_cpt_permalink_to_attachment( $post_link, $post ) { // 替换为你自己创建的自定义文章类型别名 $cpt_slug = '替换为你的CPT别名'; // 替换为你附件字段的实际字段名 $attachment_field_key = 'attachment'; if ( $post->post_type === $cpt_slug ) { $attachment_url = get_post_meta( $post->ID, $attachment_field_key, true ); // 同样如果存储的是附件ID,这里也加一步ID转URL的逻辑即可 if ( $attachment_url ) { return esc_url_raw( $attachment_url ); } } return $post_link; }
如果你是手写的自定义列表模板,也可以直接在循环中输出附件链接,示例逻辑如下:
$cpt_query = new WP_Query( array( 'post_type' => '替换为你的CPT别名', 'posts_per_page' => 10 ) ); if ( $cpt_query->have_posts() ) { while ( $cpt_query->have_posts() ) { $cpt_query->the_post(); $attachment_url = get_post_meta( get_the_ID(), 'attachment', true ); echo '<h2><a href="'.esc_url( $attachment_url ).'" target="_blank">'.get_the_title().'</a></h2>'; echo '<p>'.esc_html( get_post_meta( get_the_ID(), 'description', true ) ).'</p>'; } wp_reset_postdata(); }
内容的提问来源于stack exchange,提问作者Nakquada
相关产品推荐
相关产品推荐

