¿Es posible hacer que un complemento de wordpress se ejecute solo al publicar, no al actualizar?

He escrito un complemento de wordpress que requiere que nuestros escritores elijan un tema de un sitio externo. No permitirá que el escritor publique el artículo a menos que un tema del sitio externo esté asociado con él. Cuando se publica el artículo, el tema que eligieron se actualiza en el sitio externo y, por lo tanto, en una opción para seleccionar nuevamente.
Todo esto funciona como se esperaba. Mi problema es que cuando un usuario actualiza un artículo que ya ha sido publicado, y por lo tanto el tema ya no es una opción a elegir, el plugin deja de actualizar porque no hay tema.
Mi pregunta es: ¿hay alguna manera de garantizar que el complemento solo se ejecute cuando se publique inicialmente una publicación, no cuando se actualice?

Aquí está el código (con partes eliminadas):

<?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;
}

preguntado el 09 de marzo de 12 a las 15:03

1 Respuestas

si tu update_post_meta la primera vez, puede get_post_meta para descubrir si eso ya ha sucedido en actualizaciones posteriores.

respondido 09 mar '12, 15:03

Esa es una buena solución. Mi único problema es que también lo necesitaría para ignorar las publicaciones que ya existen. No tendrían el conjunto de meta_datos ya que se completaron antes de que agregara esa línea de código. Entonces procederían como antes, causando un problema. - trevor boland

Veo a que te refieres. Actualizar los metadatos de todas las publicaciones existentes en la instalación del complemento es una posibilidad, aunque no es atractiva. ¿Qué hay de comparar la post_date de la publicación con el tiempo de instalación del complemento? - dldnh

Eso funcionaría, pero soy bastante nuevo en wordpress (este es mi primer complemento) y no estoy seguro de cómo acceder al tiempo de instalación del complemento. Sé que puedo conectarme a la activación y configurar algo, pero no estoy seguro de dónde configurarlo, por lo que el alcance está fuera de la existencia del complemento. Traté de usar publish_post y luego comprobando if(get_post_status('$id') == publish) antes de continuar (si lo hizo, fue una actualización), pero siempre resultó ser cierto. Supongo que está actualizando el estado antes de ejecutar el complemento. Ahora estoy buscando conectarme a wp_transition_post_status. - trevor boland

oh sí, no estaba al tanto de wp_transition_post_status, parece que podría ser prometedor. dldnh

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.