首页 > 解决方案 > 如何删除所有 WordPress 帖子中的元值?

问题描述

我正在写博客,我想添加一个作为特色帖子的横幅。

但是我不确定如何只将一个帖子标记为“精选”,所以如果另一个帖子被标记为“精选”,它会删除旧帖子显示为精选。

我尝试使用 ACF(高级自定义字段)复选框来标记特色帖子,但我的方法不正确。

这是我的代码。

<?php
global $post;

$myposts = get_posts( array(
    'posts_per_page'   => 1,
    'order'            => 'DESC',
    'numberposts'      => 1,
) );

if ( $myposts ) {
    foreach ( $myposts as $post ) : 
        setup_postdata( $post ); 
        if(get_field('featured_post')):
?>

一旦我标记了其他帖子的特色,什么都没有出现。

计划采用这种方法,但我不知道如何删除旧的精选帖子。

标签: wordpress

解决方案


ACF 复选框/真/假字段是一个很好的起点。从那里开始的解决方案是......

  1. 抓住acf/save_post行动
  2. 检查当前保存的帖子是否已featured_post启用
  3. 如果启用,请取消设置以前精选帖子上的“精选”标志
  4. 如果启用,将帖子的 ID 存储为特色帖子的全局选项('mysites_featured_post')
  5. 渲染横幅后,从此选项获取特色帖子的 ID

对于该选项,您可以做两件事:使用 WP 自己的update_option,或创建一个 ACF 选项页面,其中的Post字段仅包含一个(精选)帖子。ACF 选项页面的优点是您可以通过导航到选项页面手动编辑 wp-admin 中的特色帖子。

但是,我将使用 WP 来演示它update_option

function hookACFSavePost($post_id) {
  $marked_featured = get_field('featured_post', $post_id);
  if ($marked_featured) {
    // get previously featured post
    $prev_featured_post = get_option('mysites_featured_post', false);
    if (is_numeric($prev_featured_post)) {
      // disable featured flag on the previously featured post, for consistency:
      update_field('featured_post', false, $prev_featured_post);
    }
    // store this as the current featured post
    update_option('mysites_featured_post', $post_id, true);
  }
}
add_action('acf/save_post', 'hookACFSavePost', 20);

通过这种方式,我们实现了禁用先前选择的帖子(如果存在)上的“精选”复选框,并将新精选帖子的 ID 存储在“mysites_featured_post”选项中。

然后获取用于呈现横幅的特色帖子,您可以$post_id从选项中检索:

$featured_post_id = get_option('mysites_featured_post', false);
if ($featured_post_id) {
  $post = get_post( $featured_post_id );
  // render the post('s ID)
  // ...
}

这个解决方案简单而高效,因为它不必遍历/查询所有帖子的元条目来查找当前精选帖子。


推荐阅读