Compare dois campos personalizados numéricos

3

Eu uso Advanced Custom Fields e tenho uma "correspondência" de tipo pós-postagem. Este tipo de post contém dois campos "metas feitas" e "metas contra".

Eu quero consultar o wordpress para mostrar apenas as correspondências que foram ganhas. Então, onde "metas feitas" > "gols contra".

Alguém pode me ajudar a começar este? O objetivo é ter uma página de estatísticas no final.

Thx muito por me ajudar

    
por Mister Melotte 10.09.2013 / 14:52

4 respostas

4

Acho algo assim, mas não testado, e meu SQL-foo é bastante fraco:

    $test = $wpdb->get_col( $wpdb->prepare(
    "
    SELECT DISTINCT    $wpdb->posts.*
    FROM               $wpdb->posts
    INNER JOIN         $wpdb->postmeta AS mt1 ON (
         wp_posts.ID = $wpdb->postmeta.post_id
    )
    WHERE              $wpdb->postmeta.meta_key = 'goals-made'
    AND(               mt1.meta_key = 'goals-against'
        AND            CAST($wpdb->postmeta.meta_value AS INT) > CAST(mt1.meta_value AS INT)
    )

    "
));

Isso deve retornar uma lista de post_ids que você pode processar. Mas, novamente, pode falhar miseravelmente.

    
por GhostToast 10.09.2013 / 18:20
4

Se eu estivesse na sua situação, usei uma abordagem diferente.

Adicione um meta campo oculto automaticamente quando o goals_made for atualizado.

Por exemplo,

add_action('updated_postmeta', 'update_goal_made', 20, 4);

function update_goal_made( $meta_id, $object_id, $meta_key, $_meta_value ) {
  if ( $meta_key != 'goals-made') return; // run only when update meta 'goals-made'
  // get the goals-against for post
  $against = get_post_meta($object_id, 'goals-against', true) ? : 1;
  // if 'goals-made' > 'goals-against' create/update a field '_goals-won' setted to 1
  if ( intval($_meta_value) > intval($against) ) {
    update_post_meta($object_id, '_goals-won', '1');
  } else {
    // if not delete '_goals-won' post meta (if exists)
    delete_post_meta($object_id, '_goals-won');
  }
}

Agora, para recuperar as postagens em que _goals-won existe, basta executar uma meta-consulta:

$args = (
  'posts_per_page' => -1,
  'meta_query' => array( array('meta_key'=>'_goals-won') )
);
$won_posts = get_posts($args);

EDITAR

Depois de alguns trabalhos em resposta do GhostToast Também posso fornecer a consulta SQL correta para obter o mesmo resultado.

global $wpdb;
$won_posts = $wpdb->get_results( "
    SELECT $wpdb->posts.* 
        FROM $wpdb->posts
    INNER JOIN $wpdb->postmeta AS mt1 ON ( $wpdb->posts.ID = mt1.post_id )
    INNER JOIN $wpdb->postmeta AS mt2 ON ( $wpdb->posts.ID = mt2.post_id )
    WHERE mt1.meta_key = 'goals-made' 
        AND ( 
            mt2.meta_key = 'goals-against'
            AND CAST( mt1.meta_value AS UNSIGNED ) > CAST( mt2.meta_value AS UNSIGNED )
        )
    GROUP BY $wpdb->posts.ID
" );

Nota:

Se alguém escrever a instrução SQL que manipula sua solicitação, certifique-se de que a instrução SQL terá menos desempenho do que a meta consulta mais simples como a primeira postada.

    
por gmazzap 10.09.2013 / 15:53
2

Espero não ter entendido a pergunta errada:)

$results = new WP_Query( array(
    'post_type'  => 'matches',
    'meta_query' => array(
        array(
            'key'     => 'goals-made',
            'value'   => (int) get_post_meta( get_the_ID(), 'goals-against',  true ),
            'type'    => 'INT',
            'compare' => ">",
        )
    ),
) );
if ( $results->have_posts() )
{
    while ( $results->have_posts() )
    {
        the_post();
        var_dump( $GLOBALS['post'] );
    }
}

Como não sabemos de onde você está fazendo essa consulta, basta substituir get_the_ID() dentro de get_post_meta() pelo ID recuperado das postagens que você deseja comparar.

    
por kaiser 10.09.2013 / 17:58
0

Talvez eu também não tenha entendido a pergunta, porque a resposta é óbvia para mim. Eu suponho que isso é para um post, então você teria 2 campos personalizados, foo e bar.

Então, no código ...

$foo = get_field('foo');
$bar = get_field('bar');
if ($foo > $bar) {
    echo 'foo is greater than bar';
} else {
    echo 'bar is greater than foo';
}
    
por John 06.02.2015 / 14:07