从PUBLISH_POST返回ACF自定义字段

时间:2015-08-19 作者:v0wels

我试图在帖子发布后立即返回一个自定义字段。我正在使用publish_post (或{status}_{post_type}) 操作,但看起来自定义字段是在挂钩之后创建的。

我的代码输入functions.php:

function create_recurring_posts( $ID, $post ) {
    logMe(print_r(get_post_custom($ID), true));
}
add_action( \'publish_profile\', \'create_recurring_posts\', 10, 2 );
ThelogMe() 函数只是将输出记录到一个文件中以进行测试。我的问题是,在创建概要文件帖子时,返回的自定义字段只有_edit_last_edit_lock. 但当我事后查看页面时,我看到的是相同的get_post_custom() 函数运行时,我看到了所需的其他自定义字段。

我正在使用高级自定义字段创建字段。非常感谢您的帮助。

2 个回复
SO网友:David

您的操作在中触发wp_transition_post_status() 被调用的wp_insert_post() 在动作之前save_post 已触发。save_post 是处理自定义字段的典型操作。ACF也在这方面发挥作用。

基本上,你必须等到ACF完成它的工作,这意味着你必须save_post 优先级>10或更好使用wp_insert_post 之后就是save_post.

要跟踪post状态转换,可以使用以下简单的»日志«:

<?php

namespace WPSE199070;

class PublishedTransitionLog {

    /**
     * @type array
     */
    private $status_log = [];

    /**
     * logs a published post id 
     * 
     * @wp-hook publish_profile
     *
     * @param int $post_id
     */
    public function published_post( $post_id ) {

        $blog_id = get_current_blog_id();
        if ( ! isset( $this->status_log[ $blog_id ] ) )
            $this->status_log[ $blog_id ] = [];

        if ( in_array( $post_id, $this->status_log[ $blog_id ] ) )
            return;

        $this->status_log[ $blog_id ][] = $post_id;
    }

    /**
     * @param int $post_id
     * @return bool
     */
    public function post_published( $post_id ) {

        $blog_id = get_current_blog_id();
        if ( ! isset( $this->status_log[ $blog_id ] ) )
            return FALSE;

        return in_array( $post_id, $this->status_log[ $blog_id ] );
    }
}

class PublishPostHandler {

    /**
     * @type PublishedTransitionLog
     */
    private $log;

    public function __construct( PublishedTransitionLog $log ) {

        $this->log = $log;
    }

    /**
     * @param int $post_id
     * @param \\WP_Post $post 
     * @param bool $updated
     */
    public function update( $post_id, \\WP_Post $post, $updated ) {

        if ( ! $this->log->post_published( $post_id ) )
            return;

        // do your stuff here
    }
}

$transition_log = new PublishedTransitionLog;
$handler        = new PublisPostHandler( $transition_log );

add_action( \'publish_profile\', array( $transition_log, \'published_post\' ) );
add_action( \'wp_insert_post\', array( $handler, \'update\', 10, 3 ) );
让我解释一下。第一节课,PublishedTransitionLog 倾听动作publish_profile 并在内部存储每个博客的每个已发布帖子。它还提供了一种方法来检查之前是否发布过帖子。

第二个类应该提供您的逻辑,并依赖于第一个类。如果这篇文章没有发表,那它什么都不会做。

这样你就可以独立地听两个不同的钩子。

SO网友:s_ha_dum

@David解释了代码不起作用的原因,并草拟了一个解决方案(使用save_post 而是)。但是,您可以将挂钩“链接”在一起,以便仍然能够使用转换过滤器来控制执行:

function create_recurring_posts( $ID, $post ) {
  add_action(
    \'save_post\',
    function() {
      // debug, since I don\'t have a `logMe()` function :)
      var_dump(print_r(get_post_custom($ID), true));
      die;
    },
    PHP_INT_MAX,
    1
  );   
}
add_action( \'publish_profile\', \'create_recurring_posts\', 10, 2 );

结束

相关推荐

WP_PUBLISH_POST断开固定链接

我正在创建一个系统,其中正在准备一些自定义的帖子草稿,在版主采取某些操作后,它将自动发布。因此,首先,我创建如下的后期草稿:$newpost = array( \'post_title\' => \'Raport \'.date(\"Y-m-d\"), \'post_content\' => \'Add your content here\', \'post_type\' => \'raport\', \'

从PUBLISH_POST返回ACF自定义字段 - 小码农CODE - 行之有效找到问题解决它

从PUBLISH_POST返回ACF自定义字段

时间:2015-08-19 作者:v0wels

我试图在帖子发布后立即返回一个自定义字段。我正在使用publish_post (或{status}_{post_type}) 操作,但看起来自定义字段是在挂钩之后创建的。

我的代码输入functions.php:

function create_recurring_posts( $ID, $post ) {
    logMe(print_r(get_post_custom($ID), true));
}
add_action( \'publish_profile\', \'create_recurring_posts\', 10, 2 );
ThelogMe() 函数只是将输出记录到一个文件中以进行测试。我的问题是,在创建概要文件帖子时,返回的自定义字段只有_edit_last_edit_lock. 但当我事后查看页面时,我看到的是相同的get_post_custom() 函数运行时,我看到了所需的其他自定义字段。

我正在使用高级自定义字段创建字段。非常感谢您的帮助。

2 个回复
SO网友:David

您的操作在中触发wp_transition_post_status() 被调用的wp_insert_post() 在动作之前save_post 已触发。save_post 是处理自定义字段的典型操作。ACF也在这方面发挥作用。

基本上,你必须等到ACF完成它的工作,这意味着你必须save_post 优先级>10或更好使用wp_insert_post 之后就是save_post.

要跟踪post状态转换,可以使用以下简单的»日志«:

<?php

namespace WPSE199070;

class PublishedTransitionLog {

    /**
     * @type array
     */
    private $status_log = [];

    /**
     * logs a published post id 
     * 
     * @wp-hook publish_profile
     *
     * @param int $post_id
     */
    public function published_post( $post_id ) {

        $blog_id = get_current_blog_id();
        if ( ! isset( $this->status_log[ $blog_id ] ) )
            $this->status_log[ $blog_id ] = [];

        if ( in_array( $post_id, $this->status_log[ $blog_id ] ) )
            return;

        $this->status_log[ $blog_id ][] = $post_id;
    }

    /**
     * @param int $post_id
     * @return bool
     */
    public function post_published( $post_id ) {

        $blog_id = get_current_blog_id();
        if ( ! isset( $this->status_log[ $blog_id ] ) )
            return FALSE;

        return in_array( $post_id, $this->status_log[ $blog_id ] );
    }
}

class PublishPostHandler {

    /**
     * @type PublishedTransitionLog
     */
    private $log;

    public function __construct( PublishedTransitionLog $log ) {

        $this->log = $log;
    }

    /**
     * @param int $post_id
     * @param \\WP_Post $post 
     * @param bool $updated
     */
    public function update( $post_id, \\WP_Post $post, $updated ) {

        if ( ! $this->log->post_published( $post_id ) )
            return;

        // do your stuff here
    }
}

$transition_log = new PublishedTransitionLog;
$handler        = new PublisPostHandler( $transition_log );

add_action( \'publish_profile\', array( $transition_log, \'published_post\' ) );
add_action( \'wp_insert_post\', array( $handler, \'update\', 10, 3 ) );
让我解释一下。第一节课,PublishedTransitionLog 倾听动作publish_profile 并在内部存储每个博客的每个已发布帖子。它还提供了一种方法来检查之前是否发布过帖子。

第二个类应该提供您的逻辑,并依赖于第一个类。如果这篇文章没有发表,那它什么都不会做。

这样你就可以独立地听两个不同的钩子。

SO网友:s_ha_dum

@David解释了代码不起作用的原因,并草拟了一个解决方案(使用save_post 而是)。但是,您可以将挂钩“链接”在一起,以便仍然能够使用转换过滤器来控制执行:

function create_recurring_posts( $ID, $post ) {
  add_action(
    \'save_post\',
    function() {
      // debug, since I don\'t have a `logMe()` function :)
      var_dump(print_r(get_post_custom($ID), true));
      die;
    },
    PHP_INT_MAX,
    1
  );   
}
add_action( \'publish_profile\', \'create_recurring_posts\', 10, 2 );

相关推荐

Can't publish new posts

我一直在与客户端合作,将站点迁移到新的主机提供商。我手动迁移了db,遇到了一个我以前从未见过的问题。我可以编辑所有现有帖子,但当我尝试创建新帖子时,在Permalink字段的“在此处输入标题”下,我看到:Permalink:?预览=真当我发布或保存草稿时,我收到:对不起,您不允许编辑此帖子。此外,在帖子上,没有预览按钮。为尝试修复而采取的步骤:我打开了WP\\u debug,这对这个问题没有什么帮助。我把主题切换到2017年,看看是否有主题冲突发生,没有帮助。切换主题后,我禁用了所有插件,没有帮助。我将w