Php 是否可以让wordpress插件只在发布时运行,而不在更新时运行?

Php 是否可以让wordpress插件只在发布时运行,而不在更新时运行?,php,wordpress,Php,Wordpress,我已经编写了一个wordpress插件,它要求我们的作者从外部站点选择一个主题。它将不允许作者发布文章,除非外部站点的主题与之关联。文章发布后,他们选择的主题将在外部网站上更新,因此,可以再次选择。 这一切都按预期进行。我的问题是,当用户更新一篇已经发布的文章时,主题不再是可选择的选项,插件会阻止他们更新,因为没有主题。 我的问题是:有没有办法确保插件只在文章最初发布时运行,而不是更新时运行 以下是已删除部分的代码: <?php */ Plugin Name: name Descripti

我已经编写了一个wordpress插件,它要求我们的作者从外部站点选择一个主题。它将不允许作者发布文章,除非外部站点的主题与之关联。文章发布后,他们选择的主题将在外部网站上更新,因此,可以再次选择。 这一切都按预期进行。我的问题是,当用户更新一篇已经发布的文章时,主题不再是可选择的选项,插件会阻止他们更新,因为没有主题。 我的问题是:有没有办法确保插件只在文章最初发布时运行,而不是更新时运行

以下是已删除部分的代码:

<?php
*/
Plugin Name: name
Description: Make sure writers articles are associated with a name topic.
*/
add_action('add_meta_boxes','name_add_meta_boxes');

add_action('save_post', 'complete_name_topic');


function name_add_meta_boxes() {
    add_meta_box(
            'name',
            'name',
            'name_html',
            'post',
            'normal'
    );
}


function name_html($post){
    wp_nonce_field(plugin_basename(__FILE__), 'name_nonce');
    $current_user = wp_get_current_user();
    $f_name = utf8_encode($current_user->user_firstname);
    $l_name = utf8_encode($current_user->user_lastname);
    if(!$f_name || !$l_name){
            $display_name = str_replace(' ', '%20', $current_user->display_name);
    }else{
            $display_name = $f_name.'%20'.$l_name;
    }
    $bar = json_decode(www.example.com));
    $foo = get_object_vars($bar);
    echo '<select name="name"><option value="">Choose name Topic</option>';
    foreach($foo as $id => $topic){
    echo "<option value='$id'>$topic</option>";
    }
    echo '</select>';
}

function complete_name_topic($post_id) {
    if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
            return;
    if(!wp_verify_nonce($_POST['name_nonce'], plugin_basename(__FILE__)))
            return;
    $id = wp_is_post_revision($post_id);
    if(!$id){
            $permalink = get_permalink($post_id);
    }else{
            $permalink = get_permalink($id);
    }
    if(!isset($_POST['name']) || empty($_POST['name'])){
            $message = 72;
            global $wpdb;
            $wpdb->update($wpdb->posts, array('post_status' => 'pending'), array('ID' => $post_id));
            add_filter('redirect_post_location', create_function('$location', 'return add_query_arg("message", "'.$message.'", $location);'));
    }else{
            $ch = curl_init('www.example.com');
            curl_setopt($ch, CURLOPT_POSTFIELDS, "URL=$permalink");
            curl_exec($ch);
            curl_close($ch);
    }
}


add_filter('post_updated_messages', 'name_error_message');
function name_error_message($messages){
    $messages['post']['**'] = 'A name topic must be associated with this post.';
    return $messages;
}

如果您第一次通过更新发布元数据,您可以让发布元数据发现在后续更新中是否已经发生了这种情况。

如果您第一次通过更新发布元数据,您可以让发布元数据发现在后续更新中是否已经发生了这种情况。

这是一个很好的解决方案。我唯一的问题是,我还需要它来忽略已经存在的帖子。他们不会有元数据集,因为在我添加那行代码之前他们已经完成了。所以他们会像以前一样继续,引起一个问题。我明白你的意思。在插件安装时更新所有现有帖子的元数据是一种可能,尽管不是一种吸引人的方法。比较一下帖子的发布日期和插件的安装时间怎么样?这样可以,但我对wordpress还是比较陌生。这是我的第一个插件,我不知道如何访问插件的安装时间。我知道我可以连接到激活并设置一些东西,但我不确定在哪里设置它,所以范围不在插件的存在范围之内。我尝试使用publish_post,然后在继续之前检查ifget_post_status'$id'==publish,如果它确实是一个更新,但总是发现它是真的。我猜它是在运行插件之前更新状态。现在我正在考虑连接到wp_transition_post_status。哦,是的,我不知道wp_transition_post_status-这看起来可能是一个很好的解决方案。我唯一的问题是,我还需要它来忽略已经存在的帖子。他们不会有元数据集,因为在我添加那行代码之前他们已经完成了。所以他们会像以前一样继续,引起一个问题。我明白你的意思。在插件安装时更新所有现有帖子的元数据是一种可能,尽管不是一种吸引人的方法。比较一下帖子的发布日期和插件的安装时间怎么样?这样可以,但我对wordpress还是比较陌生。这是我的第一个插件,我不知道如何访问插件的安装时间。我知道我可以连接到激活并设置一些东西,但我不确定在哪里设置它,所以范围不在插件的存在范围之内。我尝试使用publish_post,然后在继续之前检查ifget_post_status'$id'==publish,如果它确实是一个更新,但总是发现它是真的。我猜它是在运行插件之前更新状态。现在我正在寻找连接到wp_transition_post_status的链接。哦,是的,我不知道wp_transition_post_status-这看起来很有希望