Pregunta

He definido un tipo de publicación personalizado que utiliza un meta campo para almacenar fechas.

En mis funciones.php tengo el siguiente código que guarda la fecha de inicio. El formato de la fecha que se envía en el startdate El parámetro de formulario es 2010/12/01 9:00 AM

add_action('save_post', 'save_details');

function save_details(){
    global $post;
    update_post_meta($post->ID, "startdate", $_POST["startdate"]);
}

Estoy tratando de generar una lista de todos los eventos con un startdate más tarde que la hora actual.

query_posts(array(
    'post_type' => array('seminar'),
    'meta_key=startdate',
    'meta_value='.date("Y/m/d h:i A"),
    'meta_compare=>'
));

Esto enumera todos los eventos independientemente de su fecha de inicio. ¿Qué estoy haciendo mal?

Resuelto:

Por alguna razón después de cambiar mi código a lo siguiente, simplemente funciona.

$args = array(
    'post_type' => array('seminar'),
    'showposts' => 3,
    'meta_key' => 'startdate',
    'meta_value' => date("Y/m/d h:i A"),
    'meta_compare' => '>',
    'orderby' => 'meta_value',
    'order' => 'ASC'
);

$seminars = get_posts($args);

Voy a seleccionar la respuesta de @rarst como la aceptada, porque creo que en realidad tuve múltiples problemas aquí, pero abordó el problema relacionado con el mejor título.

@Sorich87 tenía un buen punto sobre cómo debería haber estado almacenando las fechas como marcas de tiempo, pero al final, @rarst tenía razón en que si especificaba un argumento de formato al date() Función que coincide con el formato que utilicé al almacenar los datos en la base de datos, entonces debería poder comparar los datos.

Gracias por toda la ayuda.

¿Fue útil?

Solución

Usted almacena la fecha como cadena formateada, pero time() Función que toma para comparar devuelve la marca de tiempo numérica. Por lo tanto, está tratando de hacer una comparación entre formatos demasiado diferentes y es poco probable que WP sea lo suficientemente inteligente como para obtener eso.

Otros consejos

Convertiría la fecha en una marca de tiempo antes de almacenarla:

add_action('save_post', 'save_details');

function save_details(){
    global $post;
    update_post_meta($post->ID, "startdate", strtotime($_POST["startdate"]));
}

Y use la marca de tiempo actual para hacer la comparación:

query_posts(array(
    'post_type' => array('seminar'),
    'meta_key=startdate',
    'meta_value='.time(),
    'meta_compare=>'
));

¿Quizás esto haría el truco?

query_posts(array(
    'post_type' => array('seminar'),
    'meta_key' => 'startdate',
    'orderby'=> 'meta_value',
    'order' => 'ASC'
));
  1. Guardar valor en una base de datos como:

    'enddate'   =>  date('Y-m-d');
    
  2. Generar meta consulta como:

Una condición :

$conArr[0]  =    array
(
'key'=> 'enddate',
'value' => date('Y-m-d'),
'compare' => '>=',
);

B. Consulta:

$args = array(
    'meta_query'=>$conArr ,
    'post_type'=>'tournament',
    'orderby' => 'meta_value_num', 
)

Importante 'orderby' => 'meta_value_num', y formato de fecha son importantes.

Licenciado bajo: CC-BY-SA con atribución
scroll top