Question

J'essaie de créer une requête de publication personnalisée pour le tri des publications qui ont été élues "Thumbs Up".

Je rejoins mon tableau personnalisé "wp_post_votes" (qui stocke le nombre de votes chaque message reçu) avec la table par défaut "WP_Posts" et afficher des messages WHERE votes > 1.

La cause où provoque une erreur SQL. Quand je retire le posts_where Filtre Je n'obtiens aucune erreur, mais tous mes messages sont affichés quel que soit leur numéro de vote.

    add_filter('posts_join', 'vote_join' );
    add_filter('posts_where', 'vote_where' );

    function vp_join( $join )
    {

      global $wpdb;

      if (isset($_GET['vote_sort'])) { //when visitor browses voted posts
        $join .= " LEFT JOIN wp_post_votes ON " . 
           $wpdb->posts . ".ID = wp_vote_posts.vote_post_id ";
      }

      return $join;
    }

    function vp_where( $where )
    {
      if (isset($_GET['vp_sort'])) {
        $where = "voted > 1";
       }

      return $where;
    }

//custom permalinks code follows...

L'erreur SQL que j'obtiens dans l'index est.

Erreur de base de données WordPress: [] SELECT T., Tt. De WP_TERMS en tant que t Inner Join WP_term_taxonomy as tt sur tt.term_id = t.term_id Inner Join wp_term_relationships as tr on tr.term_taxonomy_id = tt.term_taxonomy_id où tt.taxonomy dans ('catégorie') et tr.object_id dans (0). t.name ASC

..et dans ma barre latérale, j'ai un widget de messages récent. En ce que je reçois via $wpdb->show_errors();

Erreur de base de données WordPress: [Vous avez une erreur dans votre syntaxe SQL; Vérifiez le manuel qui correspond à votre version MySQL Server pour que la syntaxe de droite puisse utiliser près de `` voté> 1 ordre par wp_post.post_date dec limit 0, 5 'à la ligne 1] Sélectionnez SQL_CALC_FOUND_ROWS WP_POSTS. = wp_vote_post.vote_post_id où 1 = 1 a voté> 1 commande par wp_post.post_date desc limite 0, 5

j'ai remarqué WHERE 1=1 voted > 1.. Je ne sais pas si cela provoque l'erreur et comment le réparer.

Était-ce utile?

La solution

Devrait être:

$where .= " AND voted > 1";

Autres notes:

  • Au lieu de codages en dur, vous devez utiliser $wpdb->prefix . 'post_votes';

  • au lieu de vérifier dans le monde $_GET Vous devez déclarer vos filtres comme acceptant deux arguments et fonctions de code en conséquence, ces filtres passent comme deuxième objet d'argument qui contient toutes les données de requête.

Comme:

add_filter('posts_where', 'vote_where', 10, 2 );

function vote_where( $where, $query ) {

    if( isset( $query->query_vars['vp_sort'] ) );
        $where .= ' AND voted > 1';

    return $where;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top