expire wordpress user posts

时间:2015-05-21 作者:Scott Wolter

我正在尝试制作分类WordPress主题,我需要让用户的帖子过期日期加上在帖子中显示该日期。用户只允许以帖子类型发布自己的帖子,而不允许发布普通WordPress帖子。

有人知道我怎么做吗?

Update:根据对这个问题的回答,到目前为止,我不得不说,通过meta post为帖子类型指定过期日期并不是我想要的,因为用户可能会更改我想要的30天日期(意味着发布帖子后的30天)永久删除帖子,并在后端自动将日期添加到帖子中,而不是手动与管理员或作者联系。希望我的意思现在更清楚。

特别感谢:@sakibmoon。谢谢

1 个回复
SO网友:sakibmoon

您可以将过期日期设置为post meta值。在里面single.php 您可以通过查询post meta轻松显示该日期。

看见update_post_meta()get_post_meta()

现在,你问题的第二部分相当棘手。我可以想出两种解决方案。

  • Cron
您可以使用wordpress cron每隔一段时间运行一次,以检查哪个帖子已过期,并将其删除/设置为draft/不管你想对那些帖子做什么。看见wp_cron()

Pros:

<很容易实现

Cons:

<如果没有人访问您的站点,cron任务将不会启动。(对于用户频繁的繁忙站点,这不是问题)

如果你有很多帖子,每隔一段时间检查每一篇帖子会有性能损失。

根本不可靠。帖子不会在指定的时间完全过期。

(我一直讨厌wp\\u cron(),我自己从来没有使用过它)

更好的选择是使用服务器上的cron任务。但即使这样,也不能确保过期后的准确时间,因为您必须以一定的时间间隔运行cron,而且还有性能损失。

  • Modify Single.php file and Post Querysingle.php 并显示消息checking expiration\\u date。您还可以删除/设置为draft, 用户在到期日后首次请求此页面,导致404再次访问。

    要从存档页中删除过期页,可以使用pre_get_post 操作钩子来修改基于post meta的查询。

    Pros

    <确切的到期日期

    Cons:

    <再多做一点工作
  • (考虑到优点,这并不需要太多的工作。如果我是你,我会选择这个选项)

    • Use a Pluginplugins 这似乎正好做到了这一点。但我不知道它们是如何工作的,也不知道它们是否能满足您的要求。你必须自己检查这些。

      EDIT

      我正在尝试制作分类WordPress主题,我需要让用户的帖子过期日期加上在帖子中显示该日期。用户只允许以帖子类型发布自己的帖子,而不允许发布普通WordPress帖子。

      你必须使用register_post_type() 创建自定义帖子类型。如果要对它们进行分类,还需要创建自定义分类法。使用register_taxonomy() 为此。

      另请参见Is There a Difference Between Taxonomies and Categories?

      根据对这个问题的回答,到目前为止,我不得不说,通过meta post为帖子类型指定过期日期并不是我想要的,因为用户可能会更改我想要的30天日期(意味着发布帖子后的30天)永久删除帖子,并在后端自动将日期添加到帖子中,而不是手动与管理员或作者联系。

      你错在这里。后端无法保存post meta。如何创建和更新post meta取决于您。对于您的情况,最好使用save_post 操作挂钩并更新expire_date 从那里开始。示例如下

      //This hook will fire when a post is created or updated.
      add_action(\'save_post\', \'set_expire_date_meta\')
      
      function set_expire_date_meta( $post_id ) {
          //We are checking if the saved post belongs to the CPT
          if( \'custom-post-type-name-that-you-registered\' == get_post_type( $post_id ) ) {
              $meta = $get_post_meta($post_id, \'expire_date\', true);
              //If the meta already exists, the post is being updated and we don\'t need to save the meta again
              if( $meta == \'\' ) {
                  $timestamp_30day = strtotime("+1 month");
                  update_post_meta( $post_id, \'expire_date\', $timestamp_30day);
              }
          }
      }
      
      由于您希望到期日期仅适用于自定义帖子类型,请在主查询中添加一个额外的条件,如is_post_type_archive( \'custom-post-type-name-that-you-registered\' ) 在里面remove_expired_post_from_main_query 我提到的函数,以便主查询不会被更改为任何其他帖子类型,如帖子/页面等。

      在里面expire_posts_to_404_redirect, 改变is_single()is_singular(\'custom-post-type-name-that-you-registered\') 因此,只有这些自定义帖子类型才会转到404。

      //This filter will show 404 page for expired posts for the cpt that you registered
      add_filter(\'template_redirect\', \'expire_posts_to_404_redirect\' );
      function expire_posts_to_404_redirect() {
          global $wp_query;
          global $post;
      
          if( is_singular(\'custom-post-type-name-that-you-registered\') ) {
              $expire_date = get_post_meta($post->ID, \'expire_date\', true);
              if( ($expire_date != \'\') && ($expire_date < time()) ) {
                  $wp_query->set_404();
                  status_header( 404 );
              }
          }
      }
      
      //This action will alter main query to remove expired posts from archive pages of the CPT that you registered
      add_action(\'pre_get_posts\', \'remove_expired_post_from_main_query\');
      function remove_expired_post_from_main_query($query) {
          if( $query->is_main_query() && !is_admin() && is_post_type_archive(\'custom-post-type-name-that-you-registered\') ) {
              //We are comparing expiry date with current timestamp.
              //It will only keep the posts with expiry_date > current timestamp
              $meta_query = array(
                  array(
                      \'key\' => \'expire_date\',
                      \'value\' => time(),
                      \'compare\' => \'>\'
                  )
              );
              $query->set( \'meta_query\', $meta_query );
          }
      }
      
      希望这有帮助。

结束