分页无法使用自定义类型的自定义SQL查询

时间:2011-04-29 02:03:40

标签: wordpress pagination custom-post-type

我一直在努力解决这个问题2天了。我已阅读了数十篇帖子,但无法解决问题。

注意:所有var名称都是西班牙语,因为这是一个西班牙语网站。

我创建了一个名为“promocion”的自定义类型,但在我尝试转到第2页时列出档案时出现404错误。

我想设置的结构如下:

  • domain.com/promocion/new-promocion - > 这很好用
  • domain.com/promociones - >所有的清单 促销活动,这也很有效。
  • domain.com/promociones/page/2 - > 错误404 - 未找到
  • 我的档案文件的名称 template:archive-promocion.php
  • 我的单页面视图的名称 模板:single-promocion.php

WordPress版本:3.1

插件:

  • WP-页面导航
  • 帖子2帖子插件 (http://wordpress.org/extend/plugins/posts-to-posts/), 用于创建之间的关系 职位和宣传员。

这是在functions.php中创建的自定义类型

 register_post_type('promocion', array(
    'label' => 'Promociones',
    'description' => 'Promociones',
    'public' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'capability_type' => 'post',
    'hierarchical' => false,
    'rewrite' => array('slug' => 'promocion'),
    'query_var' => true,
    'has_archive' => 'promociones',
    'menu_position' => 4,
    'supports' => array('title','editor',),'labels' => array (
      'name' => 'promociones',
      'singular_name' => 'promocion',
      'menu_name' => 'Promociones',
      'add_new' => 'Añadir nueva',
      'add_new_item' => 'Añadir nueva',
      'edit' => 'Editar',
      'edit_item' => 'Editar Promoción',
      'new_item' => 'Nueva Promoción',
      'view' => 'Ver Promoción',
      'view_item' => 'Ver Promoción',
      'search_items' => 'Buscar Promociones',
      'not_found' => 'No se encontraron promociones',
      'not_found_in_trash' => 'No se encontraron promociones en la papelera',
      'parent' => 'Parent Promoción',),) );


    function my_connection_types() {
    if ( !function_exists( 'p2p_register_connection_type' ) )
        return;

    p2p_register_connection_type( array(
        'from' => 'promocion',
        'to' => 'post',
        'reciprocal' => true
    ) );
}
add_action( 'init', 'my_connection_types', 100 );

这是我的存档页面(archive-promocion.php)的开头,我在那里进行自定义SQL查询并设置分页:

   if ( $cat != '' ) {
        $cat_filter = 'wp_term_taxonomy.term_id =  "' . $cat . '" AND';
    } else {
        $cat_filter = '';
    }

 $querystr = '
    SELECT DISTINCT
        promociones.ID,
        promociones.post_title
        FROM
        wp_terms
        Inner Join wp_term_taxonomy ON wp_terms.term_id = wp_term_taxonomy.term_id
        Inner Join wp_term_relationships AS wpr ON wpr.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
        Inner Join wp_posts AS comercios ON comercios.ID = wpr.object_id
        Inner Join wp_p2p ON wp_p2p.p2p_to = comercios.ID
        Inner Join wp_posts AS promociones ON promociones.ID = wp_p2p.p2p_from
        WHERE
        wp_term_taxonomy.taxonomy =  "category" AND
        comercios.post_type =  "post" AND
        ' . $cat_filter . '
        promociones.post_type =  "promocion"
        ORDER BY
        promociones.menu_order ASC
 ';
    $totalposts = $wpdb->get_results($querystr, OBJECT);
    $ppp = 2;
    $wp_query->found_posts = count($totalposts);
    $wp_query->max_num_pages = ceil($wp_query->found_posts / $ppp);
    $on_page = intval(get_query_var('paged'));

    if($on_page == 0){ $on_page = 1; }
    $offset = ($on_page-1) * $ppp;
    $wp_query->request = $querystr . " LIMIT $ppp OFFSET $offset";
    $pageposts = $wpdb->get_results($wp_query->request, OBJECT);

.htaccess文件

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /sitiodeloschicos/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /sitiodeloschicos/index.php [L]
</IfModule>

请帮助我,我在这里疯了,我已经迟到了这个项目。谢谢!

3 个答案:

答案 0 :(得分:2)

好吧,1周后,是的,1周拉我的头发,阅读互联网上的每个论坛,并问每个人,我找到了解决方案,这是相当愚蠢的。

上面发布的所有代码都很完美,没有任何问题。

代码搞乱的是我在管理面板中设置了每页显示10个帖子。在我的代码中,我将其更改为每页仅显示1个用于测试目的,但不知何故wordpress仍在使用管理面板中配置的10值。

所以我做的是在管理面板中将值更改为1,然后在代码中增加了我的值。这是一个讨厌的解决方案,但它确实有效。

有没有办法按代码设置每页帖子的全局值?

答案 1 :(得分:0)

我的猜测是,这是因为您使用自定义SQL来获取自定义帖子类型。通过使用WP_Query类,您可以以更标准的WP方式执行查询。我会用它来获取我的自定义帖子:

$query = new WP_Query();
$query->query('post_type=promociones');
if($query->have_posts()){
    while($query->have_posts()){
        // Do your loop stuff
    }
}

如果您这样执行查询,您将能够使用内置的WP函数来获取下一个(http://codex.wordpress.org/Function_Reference/next_post_link)和之前的帖子(http:// codex .wordpress.org / Template_Tags / previous_post_link)。另外,你可以利用这个很棒的分页插件(http://wordpress.org/extend/plugins/wp-paginate/)。

请务必查看您可以对WP_Query类执行的所有操作:http://codex.wordpress.org/Function_Reference/WP_Query

答案 2 :(得分:0)

如果您使用非常永久链接收到404错误,那是因为您尚未创建自定义帖子类型存档模板文件。自定义帖子类型不会为它们提取默认模板文件。因此,您必须创建archive-post_type_name.php,single-post_type_name.php等,以避免使用404.

如果您想要与自定义帖子类型相关联的类别,则需要register_taxonomy并添加仅适用于您的自定义帖子类型的类别。 (http://codex.wordpress.org/Function_Reference/register_taxonomyhttp://justintadlock.com/archives/2010/06/10/a-refresher-on-custom-taxonomies

然后你可以使用普通的WP_Query。

在任何情况下,当您使用query_posts时,您将删除分页的所有功能。你必须加入它。即:

$cat = get_query_var('cat');
// this "activates" the pagination
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1; 
query_posts(array('posts_per_page' => '9', 'cat' => $cat, 'paged' => $paged)));