Разбиение на страницы не работает, используя пользовательский запрос SQL с пользовательским типом - PullRequest
3 голосов
/ 29 апреля 2011

Я боролся с этой проблемой уже 2 дня. Я прочитал десятки сообщений, но не могу найти решение.

Примечание: все имена var на испанском, так как это испанский сайт.

Я создал пользовательский тип с именем «promocion», но при выводе списка архивов при попытке перейти на страницу 2 появляется ошибка 404.

Структура, которую я хотел бы настроить, следующая:

  • domain.com / promocion / new-promocion -> это хорошо работает
  • domain.com / promociones -> список всех Promociones, это тоже хорошо работает
  • domain.com / promociones / page / 2 -> Ошибка 404 - не найдена
  • Имя файла архива в моем шаблон: archive-promocion.php
  • Имя просмотра одной страницы в моем шаблон: single-promocion.php

Версия WordPress: 3.1

Плагины:

  • сор-страница-навигационный
  • Сообщения 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 ]

2 голосов
/ 06 мая 2011

Ну, через 1 неделю, да, за 1 неделю, потянув за волосы, читая все форумы в Интернете и спрашивая всех, я нашел решение, которое довольно глупо.

Весь приведенный выше код работает отлично, в этом нет ничего плохого.

Что мешало с кодом, так это то, что я настроил в панели администратора отображение 10 сообщений на странице. В моем коде я изменил его, чтобы отображать только 1 на страницу для целей тестирования, но каким-то образом WordPress по-прежнему использовал значение 10, настроенное в панели администратора.

Итак, я изменил значение на 1 в панели администратора, а затем увеличил свое значение в коде. Это неприятное решение, но оно работает.

Есть ли способ настроить глобальное значение сообщений на странице по коду?

0 голосов
/ 29 апреля 2011

Если вы получаете ошибку 404 с довольно постоянными ссылками, это потому, что вы не создали файл шаблона архива с пользовательским типом записи.Пользовательские типы постов не извлекают файлы шаблонов по умолчанию для них.Поэтому вам нужно создать archive-post_type_name.php, single-post_type_name.php и т. Д., Чтобы избежать 404.

Если вы хотите категории, связанные с вашим пользовательским типом записи, то вам нужно зарегистрировать_таксономию и добавить категории,предназначены исключительно для вашего пользовательского типа сообщения.(http://codex.wordpress.org/Function_Reference/register_taxonomy и http://justintadlock.com/archives/2010/06/10/a-refresher-on-custom-taxonomies)

Тогда вы можете использовать обычный WP_Query.

В любом случае, когда вы запрашиваете_посты, вы удаляете все возможности для разбивки на страницы. У вас естьдобавить его в. т.е.:

$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)));
0 голосов
/ 29 апреля 2011

Я предполагаю, что это потому, что вы используете пользовательский 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.

...