wordpress 通过get_the_excerpt和the_excerpt函数获取文章摘要

WordPress 摘要获取
本文介绍了WordPress中如何使用the_excerpt()和get_the_excerpt()函数来获取文章摘要。the_excerpt()函数会在页面上输出文章摘要并附加[...]符号,若未手动设置摘要,则默认截取文章前55个字符;get_the_excerpt()则用于将文章摘要赋值给变量。这两个函数都只能在主循环中使用。
标签: 

the_excerpt

 

获取摘要

 

获取摘录

 

摘要区域

分类: wordpress
## 本文章已经迁移到新的博客:
## 

the_excerpt()  输出当前文章的摘要,并会附上"[...]",这不是"更多"的链接。如果你没提供一篇文章明确的摘要(后台文章编辑器的可选摘要区域),它将自动摘录文章内容中前55个字作为摘要。而HTML标签和图片都会从摘要内容中去除。此标签必须用在主循环里。

用法:

示例:

eg:

使用条件判断语句判断在分类页或者存档页显示摘要,其他页显示内容



get_the_excerpt()   返回文章摘要赋值给变量。此标签必须在主循环里。如果你仅希望输出文章摘要,你可以直接使用the_excerpt().

用法:

参数:$deprecated 没有要求

返回的值:

1、如果文章没有摘要,它将返回一个空字符串,并随后加上"[...]"。

2、对于密码保护的网页,它将返回一个字符串,默认值是"没有摘要,因为这是一个受保护的文章。”,通过函数定义可以改变文字。

3、如果文章有摘要并且没有密码保护的话,就会返回摘要作为一个字符串。

示例:

get_the_excerpt() 用于检索和存储值在一个变量,没有输出到页面。

eg1:

0

0

阅读 (7046)   评论   (1) 收藏 (0)   转载 (2)   喜欢   打印 举报
已投稿到:
if (!function_exists('get_article_for_category')) { function get_article_for_category( $category, $posts_per_page = 5, $tag = '' ,// 新增参数:标签(tag) $include_meta = true, $include_acf = true, $orderby = 'menu_order', $order = 'DESC' ) { // 限制只允许的排序字段 $allowed_orderby = array('date', 'menu_order'); if (!in_array($orderby, $allowed_orderby)) { $orderby = 'date'; // 默认回退到按时间排序 } // 设置基础查询参数 $args = array( 'posts_per_page' => $posts_per_page, 'orderby' => $orderby, 'order' => $order, ); // 添加分类查询条件 if (is_numeric($category)) { $args['tax_query'][] = array( 'taxonomy' => 'category', 'field' => 'term_id', 'terms' => $category, ); } else { $args['tax_query'][] = array( 'taxonomy' => 'category', 'field' => 'slug', 'terms' => $category, ); } if (!empty($tag)) { $args['tax_query']['relation'] = 'AND'; if (is_numeric($tag)) { $args['tax_query'][] = array( 'taxonomy' => 'post_tag', 'field' => 'term_id', 'terms' => $tag, ); } else { $args['tax_query'][] = array( 'taxonomy' => 'post_tag', 'field' => 'slug', 'terms' => $tag, ); } } if ($orderby === 'menu_order') { $args['orderby'] = 'menu_order'; } $query = new WP_Query($args); if ($query->have_posts()) { $posts = array(); while ($query->have_posts()) { $query->the_post(); $post_id = get_the_ID(); $post_data = array( 'id' => $post_id, 'title' => get_the_title(), 'permalink' => get_the_permalink(), 'excerpt' => get_the_excerpt(), 'content' => get_the_content(), 'thumbnail' => has_post_thumbnail() ? get_the_post_thumbnail_url() : '', 'date' => get_the_date(), 'author' => get_the_author(), 'modified_date' => get_the_modified_date(), 'type' => get_post_type(), 'status' => get_post_status(), 'comment_count' => get_comments_number(), ); // 获取所有自定义字段(post meta) if ($include_meta) { $meta = get_post_meta($post_id); $post_data['meta'] = $meta; } // 如果使用了 ACF,获取 ACF 字段 if ($include_acf && function_exists('get_fields')) { $acf_fields = get_fields(); if ($acf_fields) { $post_data['acf'] = $acf_fields; } } $posts[] = $post_data; } wp_reset_postdata(); return $posts; } return false; } }
07-22
<think>根据用户需求,需要实现一个WordPress函数,用于根据分类标签筛选文章,并支持自定义排序(如menu_order)以及获取自定义字段(包括metaACF字段)。我们将使用`WP_Query`来构建查询。 ### 函数设计思路 1. **参数设计**: - `$category`:分类名称或ID,可以传入数组以支持多个分类。 - `$tag`:标签名称或ID,可以传入数组以支持多个标签。 - `$orderby`:排序字段,默认为'menu_order'(WordPress菜单顺序),也可以支持其他字段如'date'、'title'等。 - `$order`:排序方式,'ASC'(升序)或'DESC'(降序),默认为'ASC'。 - `$meta_fields`:需要获取的自定义字段名称数组(包括ACF字段),函数将把这些字段的值附加到每篇文章对象中。 2. **查询构建**: - 使用`WP_Query`构建查询参数数组。 - 分类查询使用`tax_query`参数,标签也属于分类法(taxonomy)的一种,所以同样用`tax_query`处理。 - 注意:分类标签可以同时存在,它们之间是“与”的关系(AND)还是“或”的关系(OR)?这里根据常见需求,我们默认使用“与”的关系(即同时满足分类标签),但也可以根据需求调整。不过,用户需求中没有明确,我们先按“与”实现,若需要更灵活,可以增加参数控制。 3. **获取自定义字段**: - 在循环中,对于每篇文章,根据`$meta_fields`数组中的字段名,使用`get_post_meta`或ACF的函数(如果ACF已安装)来获取字段值。注意:ACF字段也可以使用`get_post_meta`获取,但有时需要特定函数(如获取字段对象),这里为简化,我们统一用`get_post_meta`获取原始值。如果需要ACF格式化的值,可以稍后扩展。 4. **返回结果**: - 返回一个包含文章对象数组,每个文章对象附加一个属性(例如`custom_fields`)来存储获取的自定义字段。 ### 代码实现 ```php /** * 根据分类标签获取文章,支持自定义排序获取自定义字段 * * @param string|array $category 分类名称、ID或数组 * @param string|array $tag 标签名称、ID或数组 * @param string $orderby 排序字段,默认为'menu_order' * @param string $order 排序方式,默认为'ASC' * @param array $meta_fields 需要获取的自定义字段名称数组 * @return array 返回文章数组,每篇文章附加自定义字段 */ function get_article_for_category($category = '', $tag = '', $orderby = 'menu_order', $order = 'ASC', $meta_fields = array()) { // 构建查询参数 $args = array( 'post_type' => 'post', // 文章类型,默认为post 'posts_per_page' => -1, // 获取所有符合条件的文章,如果文章数量多,可以改为分页 ); // 排序参数 $args['orderby'] = $orderby; $args['order'] = $order; // 构建分类查询条件 $tax_query = array(); if (!empty($category)) { $tax_query[] = array( 'taxonomy' => 'category', 'field' => is_numeric($category) ? 'term_id' : 'name', 'terms' => $category, ); } if (!empty($tag)) { $tax_query[] = array( 'taxonomy' => 'post_tag', 'field' => is_numeric($tag) ? 'term_id' : 'name', 'terms' => $tag, ); } // 如果有多个分类条件,设置它们的关系为AND(同时满足) if (count($tax_query) > 1) { $tax_query['relation'] = 'AND'; } if (!empty($tax_query)) { $args['tax_query'] = $tax_query; } // 执行查询 $query = new WP_Query($args); $posts = $query->posts; // 获取每篇文章的自定义字段 foreach ($posts as $post) { $post->custom_fields = array(); foreach ($meta_fields as $field) { // 使用get_post_meta获取自定义字段值 $post->custom_fields[$field] = get_post_meta($post->ID, $field, true); } } return $posts; } ``` ### 使用示例 ```php // 示例:获取分类为'news'且标签为'important'的所有文章,按menu_order升序排列,并获取两个自定义字段'price''color' $articles = get_article_for_category('news', 'important', 'menu_order', 'ASC', array('price', 'color')); // 遍历文章 foreach ($articles as $article) { echo $article->post_title; echo '价格:' . $article->custom_fields['price']; // ... 其他操作 } ``` ### 注意事项 1. **性能考虑**:如果文章数量很大,获取所有文章(`posts_per_page`为-1)可能会导致性能问题。可以考虑分页,增加参数如`$posts_per_page``$paged`。 2. **分类标签的关系**:当前实现中,分类标签是AND关系(必须同时满足)。如果需要OR关系,可以将`$tax_query`中的`relation`设置为'OR'。但用户需求未明确,所以按AND实现。如果需要更灵活,可以增加一个参数`$relation`。 3. **自定义字段**:这里使用`get_post_meta`获取字段值,返回的是字符串(或数组,如果字段是数组类型)。对于ACF字段,如果字段是复杂类型(如图片、关系等),可能需要使用ACF的函数(如`get_field`)来获取格式化数据。因此,如果项目中使用ACF且需要获取复杂字段,可以修改为使用`get_field`(需要检查ACF是否激活)。 ### 扩展建议 - 增加错误处理,比如查询失败时返回空数组。 - 考虑添加缓存机制,避免重复查询。 - 如果需要支持多种文章类型,可以增加`$post_type`参数。 §§相关问题§§ 1. 如何修改函数以支持分页查询? 2. 如何调整分类标签之间的逻辑关系(例如从AND改为OR)? 3. 如何获取ACF字段的格式化值(例如图片字段返回图片对象而不是ID)?</think>### 实现 WordPress 函数 `get_article_for_category` 以下是完整的函数实现代码,包含分类/标签筛选、自定义排序元字段获取功能: ```php /** * 根据分类标签筛选文章,支持自定义排序获取元字段 * * @param int|string|array $categories 分类ID/名称/别名(支持数组) * @param int|string|array $tags 标签ID/名称(支持数组) * @param string $orderby 排序字段(默认'menu_order') * @param string $order 排序方向(默认'ASC') * @param array $meta_fields 需要获取的元字段名(支持ACF字段) * @param int $posts_per_page 每页文章数(默认-1返回全部) * @return WP_Post[] 文章对象数组(包含附加的meta_fields属性) */ function get_article_for_category($categories = [], $tags = [], $orderby = 'menu_order', $order = 'ASC', $meta_fields = [], $posts_per_page = -1) { $tax_query = ['relation' => 'AND']; // 构建分类查询 if (!empty($categories)) { $tax_query[] = [ 'taxonomy' => 'category', 'field' => is_numeric($categories) ? 'term_id' : 'slug', 'terms' => $categories ]; } // 构建标签查询 if (!empty($tags)) { $tax_query[] = [ 'taxonomy' => 'post_tag', 'field' => is_numeric($tags) ? 'term_id' : 'slug', 'terms' => $tags ]; } $args = [ 'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => $posts_per_page, 'tax_query' => $tax_query, 'orderby' => $orderby, 'order' => $order ]; // 添加元字段查询支持 if ($orderby === 'meta_value' || $orderby === 'meta_value_num') { $args['meta_key'] = $meta_fields[0] ?? ''; } $query = new WP_Query($args); $posts = $query->posts; // 附加自定义字段到文章对象 foreach ($posts as $post) { $post->meta_fields = []; foreach ($meta_fields as $field) { // 优先使用ACF函数获取字段(如果ACF激活) if (function_exists('get_field')) { $post->meta_fields[$field] = get_field($field, $post->ID); } else { $post->meta_fields[$field] = get_post_meta($post->ID, $field, true); } } } return $posts; } ``` ### 使用示例 ```php // 示例1:获取分类ID为5且标签为"精选"的文章,按menu_order排序 $articles = get_article_for_category( $categories = 5, $tags = '精选', $orderby = 'menu_order' ); // 示例2:获取多个分类文章,附加ACF字段 $articles = get_article_for_category( $categories = ['科技', '人工智能'], // 分类别名 $tags = [12, 15], // 标签ID $orderby = 'date', // 按日期排序 $order = 'DESC', // 降序 $meta_fields = ['author_name', 'rating'] // 元字段 ); // 遍历结果 foreach ($articles as $post) { echo $post->post_title; echo $post->meta_fields['author_name']; // 访问自定义字段 } ``` ### 关键功能说明 1. **分类/标签筛选**: - 支持字符串/数字/数组格式输入 - 自动识别ID或别名(`term_id`/`slug`) - 使用`tax_query`实现多条件组合查询[^1] 2. **自定义排序**: - 默认使用`menu_order`(菜单顺序) - 支持标准参数:`date`、`title`、`rand`等 - 支持元字段排序(`meta_value`/`meta_value_num`) 3. **元字段获取**: - 自动检测ACF插件是否存在 - 使用`get_field()`获取ACF字段(保留字段类型) - 备用方案使用`get_post_meta()` - 字段附加到文章对象的`meta_fields`属性 4. **性能优化**: - 单次查询完成所有筛选 - 字段获取在循环外处理 - 支持分页参数(`posts_per_page`) ### 注意事项 1. 使用前确保传递的分类/标签存在 2. 排序字段`meta_value`需要配合`meta_key`参数 3. 如需更复杂的查询(如OR关系),可扩展`tax_query`参数 4. 大量数据查询建议添加缓存机制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值