如何做有条件的出版?

时间:2021-07-06 作者:David Valenzuela

我正在尝试编写一个插件,如果某个给定的条件不满足,我将阻止用户发布(或更新)一篇文章,例如,如果该文章的标题已经在另一篇文章中使用(我正在使用自定义的文章类型,如果这样做会产生影响的话)。我编写了一个函数,通过“transition\\u post\\u status”钩子调用该函数,试图在日志在数据库中发布或更新之前捕获该日志,以便阻止这种情况的发生。当我用一个我知道已经使用过的标题进行测试时,当wp\\u die()函数发生时,我会看到错误消息,所以我知道这个函数正在被调用。然而,无论如何,这篇文章正在创建中。我有什么遗漏吗?这是在将帖子保存到数据库之前检查条件的最佳方法吗?

这是我在构造器中拥有的:

add_action( \'transition_post_status\', array( $this, \'post_publish_control\' ), 10, 3 );
课程后期:

public function post_publish_control( $new_status, $old_status, $post ) {

   // Make sure this function runs on correct post type
   if( $post->post_type === \'my_custom_post_type\' ) {

      // On first-time publish or post update
      if( $new_status === \'publish\' ) {

         // Try to catch an already existing title before post is saved
         if( does_post_title_exist( $post->post_title ) ) {
            wp_die( \'Title is already being used, try a different one.\' );
         }
         // Continue if conditions are met
         else {
            return;
         }
      }
   }
}
我更习惯于面向对象编程,所以我尝试将这个插件作为自己的类来编写。

1 个回复
SO网友:Mikaël Mayer

那是因为钩子;“transition\\u post\\u status”(转换后状态);被称为:

在数据库中发布或更新帖子后,在数据库中更新状态后relevant WordPress source code:

/**
 * Fires immediately before an existing post is updated in the database.
 *
 * @since 2.5.0
 *
 * @param int   $post_ID Post ID.
 * @param array $data    Array of unslashed post data.
 */
do_action( \'pre_post_update\', $post_ID, $data );
此代码后面紧接着调用$wpdb->update( $wpdb->posts, $data, $where ), 这实际上会将帖子保存到数据库中。

Usability issue. 我主张不要打电话wp_die() 例如,如果只是标题与数据库中的标题相同。这是一种糟糕的用户体验。使用add_filter 如果发生这种情况,请重命名标题:

/**
 * Filters slashed post data just before it is inserted into the database.
 *
 * @since 2.7.0
 *
 * @param array $data    An array of slashed post data.
 * @param array $postarr An array of sanitized, but otherwise unmodified post data.
 */
$data = apply_filters( \'wp_insert_post_data\', $data, $postarr );

相关推荐

用户创建的wordpress页面中的php代码将在何时以及如何执行?

我对Wordpress构建的网站中的网页加载时发生的情况的理解是,Wordpress确定要加载的帖子(页面)和模板。然后加载页面和模板。我实际上是想弄清楚,当我在基于WP的网站中单击链接时,WP是如何创建一个最终网页,并将其发送到我的浏览器的。我还试图弄清楚页面模板扮演的角色,尤其是当它基本上是空的,就像WP的默认twentytwenyone主题中的一样。我这样问是因为我通常不编辑页面模板,而是编辑页面,在页面上放置块和小部件(后者可能经常包含php代码)。这一页是我在构建一些;“常规”;网页Wordpr