¿Es posible hacer que un complemento de wordpress se ejecute solo al publicar, no al actualizar?
Frecuentes
Visto 316 veces
2
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;
}
1 Respuestas
0
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
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas php wordpress or haz tu propia pregunta.
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 comprobandoif(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 awp_transition_post_status
. - trevor bolandoh sí, no estaba al tanto de wp_transition_post_status, parece que podría ser prometedor. dldnh