Форум программистов, компьютерный форум, киберфорум
WordPress
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
14 / 14 / 2
Регистрация: 04.08.2014
Сообщений: 121

Как доделать стрелочную пагинацию?

07.06.2016, 17:49. Показов 512. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сами стрелки
HTML5
1
2
<button type="submit" class="prev"></button>
<button type="submit" class="next"></button>

Обработчик
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var btn_load_post = $('.prev'),
    url_controller = "/wp-content/themes/sharkz_theme/custom_types/functions-portfolio.php";
 
$(function(){
    
 
    btn_load_post.on('click',function(e){
        e.preventDefault();
        $.ajax({
            type       : "POST",
            data       : {action_page : "prev",},
            url        : url_controller,
            success    : function(data){
                
                alert('oressed');
               
              
            }   
        });
    });
});
Обработчик PHP
PHP
1
2
3
4
if (isset($_POST['action_page'])){
  $paged = $_POST['action_page'];
  var_dump($paged);
}

Вар дамп ничего не дает, идея что бы при нажатии на кнопку отправлялся бы ajax запрос, и в зависимости от запроса prev или next, php должен выполнить $I--/$I++

Парни кто знает помогите с решением, плиз, не проходите мимо, + к карме гарантирован!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.06.2016, 17:49
Ответы с готовыми решениями:

Добавить nofollow в пагинацию
Всем привет! Ребята помогите: нужно добавить rel=&quot;nofollow&quot; в пагинацию. Она сделана отдельной функцией, а не плагином. Вот функция ...

Убрать пагинацию на главной странице
Здравствуйте! Подскажите, пожалуйста, как убрать с главной страницы сайта строку с пагинацией? Сайт на Денвере. Исследование элемента...

Сделать пагинацию для произвольного типа поста
Здравствуйте не выводится пагинация для произвольного типа поста. Сами посты выводятся нормально, а вот постраничную навигацию к ним не...

13
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
08.06.2016, 07:38
идея с кустомным файлом для обработки не правильна.. это ВП, тут есть admin-ajax.php который может сделать то что нужно..

1) делаем локализацию вашего скрипта и обавляем переменную ajax_url ( ищи в гугле ) [ admin_url( 'admin-ajax.php' ) ]
2) создаём 2 экшена с 1-й и той же функцией add_action( 'wp_ajax_{name}', 'function_name' ) и add_action( 'wp_ajax_nopriv_{name}', 'function_name' ); где {name} уникальный индификатор вашей функции
3) завершать вашу функцию лучше чем- то вроде send_json_success или send_json_error для отправки JSON данных ( так их легче читать через js )
4) формировать ajax запрос в js примерно следующим образом:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
$.ajax({
  type       : "POST",
  data       : {
    action: '{name}', // уникальное имя используемое в экшене 2-м пункте
    action_page : "prev", // любые параметры
  },
  url        : ajax_url, // локализованная строка с admin_url( 'admin-ajax.php' ), на самом деле будет что-то типо myvar.ajax_url
  success    : function(data){
    console.log( data );       
  }   
});
Вот, таким образом та функция которая будет обрабатывать твой ajax запрос сможет сделать что угоднно, т.к. бует в контексте ВП ( будет доступна база и все функции ВП.. в отличии от подхода который ты делал )

Ещё можно попробовать использовать $_REQUEST вместо $_POST или $_GET ( но это уже в экшене )
1
14 / 14 / 2
Регистрация: 04.08.2014
Сообщений: 121
08.06.2016, 12:57  [ТС]
Попытался сделать как Вы сказали и застрял, в чем может быть причина?
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
add_action( 'wp_enqueue_scripts', 'myajax_data', 99 );
function myajax_data(){
 
    wp_localize_script( 'my-ajax-request', 'myajax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
 
}
add_action('wp_footer', 'prev_action', 99); // для фронта
function prev_action() {
    ?>
    <script type="text/javascript" >
    $(function(){
        $('.prev').on('click',function(e){
            e.preventDefault();
            $.ajax({
                type       : "POST",
                data       : {
                action: 'prev', // уникальное имя используемое в экшене 2-м пункте
                action_page : "prev", // любые параметры
                },
                url        : myajax.php, // локализованная строка с admin_url( 'admin-ajax.php' ), на самом деле будет что-то типо myvar.ajax_url
                success    : function(data){
                    console.log( data ); 
                    alert('worked');      
                }   
            });
        });
    });
    </script>
    <?php
}
 
add_action('wp_ajax_prev', 'prev_callback');
add_action('wp_ajax_nopriv_prev', 'prev_callback');
function prev_callback() {
    $prev = intval( $_POST['action_page'] );
 
    echo $prev;
 
    // выход нужен для того, чтобы в ответе не было ничего лишнего, только то что возвращает функция
    wp_die();
}
в консоли пишет Uncaught ReferenceError: myajax is not defined

Добавлено через 43 минуты
Зработало - так, но все время в консоль выдает 0
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function myajax_data() {
 
    wp_enqueue_script('ajax-register-script', get_template_directory_uri() . '/js/app.js');
    wp_localize_script('ajax-register-script', 'myajax', array(
            'ajaxurl' => admin_url( 'admin-ajax.php' )
        )
    );
 
 
}
add_action('wp_enqueue_scripts', 'myajax_data');
 
add_action('wp_footer', 'prev_action', 99); // для фронта
function prev_action() {
    ?>
    <script type="text/javascript" >
    $(function(){
        $('.prev').on('click',function(e){
            e.preventDefault();
            $.ajax({
                type       : "POST",
                data       : {
                action: 'prev_callback', // уникальное имя используемое в экшене 2-м пункте
                action_page : 'prev', // любые параметры
                num: 1,
                },
                url        : myajax.ajaxurl, // локализованная строка с admin_url( 'admin-ajax.php' ), на самом деле будет что-то типо myvar.ajax_url
                success    : function(data){
                    console.log( data );  
                }   
            });
        });
    });
    </script>
    <?php
}
 
add_action('wp_ajax_prev_callback', 'prev_callback');
add_action('wp_ajax_nopriv_prev_callback', 'prev_callback');
function prev_callback() {
    $prev = intval( $_POST['action_page'] );
 
    echo $prev;
 
    // выход нужен для того, чтобы в ответе не было ничего лишнего, только то что возвращает функция
    wp_die();
}
Добавлено через 26 минут
В общем заработало все так, но к сожалению с переменной $i ничего не происходит, вот весь код
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
function shortcode_portfolio() {   
    global $wpdb; 
    $portfolio_arr = $wpdb->get_results( " SELECT ID FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'portfolio' AND ID IS NOT NULL" );
    if( $portfolio_arr ) {
        foreach ( $portfolio_arr as $portfolio_item ) {
            $portfolio_id_arr[] += $portfolio_item->ID;
        }
    }
    $i = 0;
    $i_max = count($portfolio_id_arr) - 1;
 
    for ($y = 0; $y < 3; $y++) { 
    if ( $i <= $i_max && $i > -1) {
      $portfolio_id_arr_3el[] += $portfolio_id_arr[$i];
      $i++;
      var_dump($portfolio_id_arr_3el);
      var_dump($i); 
    } else {
      $i = 0;
      $portfolio_id_arr_3el[] += $portfolio_id_arr[$i];
       $i++;
       var_dump($portfolio_id_arr_3el);
      var_dump($i);
    }   
    
  }
  $i=$y;
  var_dump($_POST);
  var_dump($_GET);
    //var_dump($portfolio_id_arr);
    $portfolio = new WP_Query( array('post__in' => $portfolio_id_arr_3el ,  'post_type' => 'portfolio', 'order' => 'ASC') ); ?>
 
    <div class="grid grid-tab p-t-130"> 
        <div class="col-1-1">
            <h2>последние работы</h2><a href="#ajaxthing" class="myajax">click</a>
        </div>      
    </div>
    <div class="grid grid-tab p-lr-130 portfolio-nav">
    
    <button type="submit" class="prev"></button>
    <button type="submit" class="next"></button>
    
<?php   
        if ( $portfolio->have_posts() ) :
            while ( $portfolio->have_posts() ) :                
                    $portfolio->the_post(); 
 
                    $portfolio_img = get_field('portfolio-img');
                    $portfolio_title = get_field('portfolio-title');
                    $portfolio_descr = get_field('portfolio-descr');
                    ?>
                        <div class="col-1-3 service portfolio">                     
                            <?php
                            if( !empty($portfolio_img) ): ?>
                            <img src="<?php echo $portfolio_img['url']; ?>" alt="<?php echo $portfolio_img['alt']; ?>" title="<?php echo $portfolio_img['title']; ?> "  />
                            <?php endif;
                            if( !empty($portfolio_title) ): ?>
                                <h3> <?php echo $portfolio_title; ?> </h3>
                            <?php endif;
                            if( !empty($portfolio_descr) ): ?>
                                <p> <?php echo $portfolio_descr; ?> </p>
                            <?php endif; ?>
                                <a href="<?php echo get_permalink(); ?>"> подробнее </a>
                        </div>                                                  
        <?php   endwhile;
            endif; ?>
     </div> 
    
<?php }
 
 
add_action('wp_footer', 'prev_action', 99); 
function prev_action() {
    ?>
    <script type="text/javascript" >
    $(function(){
        $('.prev').on('click',function(e){
            e.preventDefault();
            $.ajax({
                type       : "POST",
                data       : {
                action: 'prev_call',
                action_page : 'prev', 
                },
                url        : myajax.ajaxurl,
                success    : function(data){
                    alert( data );  
                }   
            });
        });
        $('.next').on('click',function(e){
            e.preventDefault();
            $.ajax({
                type       : "POST",
                data       : {
                action: 'prev_call', 
                action_page : 'next', 
                },
                url        : myajax.ajaxurl, 
                success    : function(data){
                    alert( data );  
                }   
            });
        });
    });
    </script>
    <?php
}
 
add_action('wp_ajax_prev_call', 'prev_callback');
add_action('wp_ajax_nopriv_prev_call', 'prev_callback');
function prev_callback() {
    $action = $_POST['action_page'];
    if ($action = "prev") {
        $i++;       
    } elseif ($action = "next") {
        $i--;
    }
 
    echo $action;
    wp_die();
}
 
add_shortcode('shortcode_portfolio', 'shortcode_portfolio');
Добавлено через 27 секунд
Кто может, плиз хелп!
0
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
08.06.2016, 18:08
у вас во первых ошибка if ($action === "prev") в условиях должно быть 2 == или 3 === что бы сравнивать, 1-о = это присваивание

Во вторых у вас нету переменной $i которая должна увеличиваться.. вам нужно передавать её вместе в data и увеличивать...
1
14 / 14 / 2
Регистрация: 04.08.2014
Сообщений: 121
08.06.2016, 18:17  [ТС]
muxahuk1214, я вам в лс написал, посмотрите пожалуйста!
А код уже выглядит так, но все еще не работает
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
<?php
/**
 * sharkz_theme functions and definitions.
 *
 * @link https://developer.wordpress.org/themes/basics/theme-functions/
 *
 * @package sharkz_theme
 */
 
add_action('init', 'portfolio');
function portfolio()
{
  $labels = array(
    'name' => 'Портфолио',
    'singular_name' => 'Портфолио',
    'add_new' => 'Добавить элемент',
    'add_new_item' => 'Добавить новый элемент',
    'edit_item' => 'Редактировать элемент',
    'new_item' => 'Новый элемент',
    'view_item' => 'Посмотреть элемент',
    'search_items' => 'Найти элемент',
    'not_found' =>  'Элемент не найден',
    'not_found_in_trash' => 'В корзине Элемнты не найдены',
    'parent_item_colon' => '',
    'menu_name' => 'Портфолио'
  );
 
  $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'query_var' => true,
    'rewrite' => true,
    'capability_type' => 'post',
    'has_archive' => true,
    'hierarchical' => false,
    'menu_position' => 5,
    'supports' => array('title', 'custom-fields'),
    'taxonomies' => array('portfolio'),
  );
  register_post_type('portfolio',$args);  
}
 
function shortcode_portfolio() {    
    global $wpdb; 
    $portfolio_arr = $wpdb->get_results( " SELECT ID FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'portfolio' AND ID IS NOT NULL" );
    if( $portfolio_arr ) {
        foreach ( $portfolio_arr as $portfolio_item ) {
            $portfolio_id_arr[] += $portfolio_item->ID;
        }
    }
    $_SESSION["i"] = 0;
    ?>  
 
    <input type="hidden" name="current_page" value="<?php echo $_SESSION["i"];?>" >
    <?php
    $i_max = count($portfolio_id_arr) - 1;
 
    for ($y = 0; $y < 3; $y++) { 
        if ( $_SESSION["i"] <= $i_max && $_SESSION["i"] > -1 ) {
          $portfolio_id_arr_3el[] += $portfolio_id_arr[$_SESSION["i"]];
          $_SESSION["i"]++;
        } else {
          $_SESSION = 0;
          $portfolio_id_arr_3el[] += $portfolio_id_arr[$_SESSION["i"]];
          $_SESSION["i"]++;
        }
    }
    ?>
    <div class="grid grid-tab p-t-130"> 
        <div class="col-1-1">
            <h2>последние работы</h2>
        </div>      
    </div>
    <div class="grid grid-tab p-lr-130 portfolio-nav">
    <button type="submit" class="prev"></button>
    <button type="submit" class="next"></button>
    
    <?php   
        $portfolio = new WP_Query( array('post__in' => $portfolio_id_arr_3el ,  'post_type' => 'portfolio', 'order' => 'ASC') ); 
        if ( $portfolio->have_posts() ) :
            while ( $portfolio->have_posts() ) :                
                    $portfolio->the_post(); 
 
                    $portfolio_img = get_field('portfolio-img');
                    $portfolio_title = get_field('portfolio-title');
                    $portfolio_descr = get_field('portfolio-descr');
                    ?>
                        <div class="col-1-3 service portfolio">                     
                            <?php
                            if( !empty($portfolio_img) ): ?>
                            <img src="<?php echo $portfolio_img['url']; ?>" alt="<?php echo $portfolio_img['alt']; ?>" title="<?php echo $portfolio_img['title']; ?> "  />
                            <?php endif;
                            if( !empty($portfolio_title) ): ?>
                                <h3> <?php echo $portfolio_title; ?> </h3>
                            <?php endif;
                            if( !empty($portfolio_descr) ): ?>
                                <p> <?php echo $portfolio_descr; ?> </p>
                            <?php endif; ?>
                                <a href="<?php echo get_permalink(); ?>"> подробнее </a>
                        </div>                                                  
        <?php   endwhile;
            endif;
        wp_reset_query(); ?>
     </div> 
    
<?php }
 
add_shortcode('shortcode_portfolio', 'shortcode_portfolio');
 
add_action('wp_footer', 'prev_action', 99); 
function prev_action() {
    ?>
    <script type="text/javascript" >    
    var current_page = $("input[name='current_page']").val();
    $(function(){
        $('.prev').on('click',function(e){
            e.preventDefault();
            $.ajax({
                type       : "POST",
                data       : {
                action: 'prevcall',
                action_page : 'prev',
                page : current_page, 
                },
                url        : myajax.ajaxurl,
                success:function(html){ 
                current_page++;     
                $("input[name='current_page']").val(current_page);
 
            }
            });
        });
        $('.next').on('click',function(e){
            e.preventDefault();
            $.ajax({
                type       : "POST",
                data       : {
                action: 'nextcall', 
                action_page : 'next', 
                page : current_page--,
                },
                url        : myajax.ajaxurl, 
                success:function(data){
                $("input[name='current_page']").val(current_page);
            }
            });
        });
    });
    </script>
<?php }
 
add_action('wp_ajax_nextcall', 'next_callback');
add_action('wp_ajax_nopriv_nextcall', 'next_callback');
function next_callback() {
    $_SESSION["i"] = $_POST['page'] - 1;
    wp_reset_query();
    wp_die();
}
add_action('wp_ajax_prevcall', 'prev_callback');
add_action('wp_ajax_nopriv_prevcall', 'prev_callback');
function prev_callback() {
    $_SESSION["i"] = $_POST['page'] + 1;    
    wp_reset_query();
    wp_die();
}
0
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
08.06.2016, 19:26
Вот так примерно должно выглядеть:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
<?php
/**
 * sharkz_theme functions and definitions.
 *
 * @link https://developer.wordpress.org/themes/basics/theme-functions/
 *
 * @package sharkz_theme
 */
 
add_action('init', 'portfolio');
function portfolio()
{
  $labels = array(
    'name' => 'Портфолио',
    'singular_name' => 'Портфолио',
    'add_new' => 'Добавить элемент',
    'add_new_item' => 'Добавить новый элемент',
    'edit_item' => 'Редактировать элемент',
    'new_item' => 'Новый элемент',
    'view_item' => 'Посмотреть элемент',
    'search_items' => 'Найти элемент',
    'not_found' =>  'Элемент не найден',
    'not_found_in_trash' => 'В корзине Элемнты не найдены',
    'parent_item_colon' => '',
    'menu_name' => 'Портфолио'
  );
 
  $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'query_var' => true,
    'rewrite' => true,
    'capability_type' => 'post',
    'has_archive' => true,
    'hierarchical' => false,
    'menu_position' => 5,
    'supports' => array('title', 'custom-fields'),
    'taxonomies' => array('portfolio'),
  );
  register_post_type('portfolio',$args);
}
 
function queryPortfolio( $page = 0, $limit = 5, $exclude = false ) {
    $args = array(
        'post_type' => 'portfolio',
        'posts_per_page' => $limit,
        'offset' => $page * $limit,
        'order' => 'ASC'
    );
 
    if( is_string( $exclude ) && ! empty( $exclude ) ) {
        $exclude = array_map( 'trim', explode( ',', $exclude ) );
    } elseif ( ! is_numeric( $exclude ) && ! is_array( $exclude ) ) {
        $exclude = false;
    }
 
    if( $exclude ) $args[ 'post__not_in'] = $exclude;
 
    return new WP_Query( $args );
} // queryPortfolio
 
function porfolioOutput() {
    $portfolio_img = get_field('portfolio-img');
    $portfolio_title = get_field('portfolio-title');
    $portfolio_descr = get_field('portfolio-descr');
    ?>
    <div class="col-1-3 service portfolio">
        <?php if( ! empty( $portfolio_img ) ): ?>
            <img src="<?php echo $portfolio_img['url']; ?>" alt="<?php echo $portfolio_img['alt']; ?>" title="<?php echo $portfolio_img['title']; ?> "  />
        <?php endif;
        if( ! empty( $portfolio_title ) ) : ?>
            <h3><?php echo $portfolio_title; ?></h3>
        <?php endif;
        if( !empty($portfolio_descr) ): ?>
            <p><?php echo $portfolio_descr; ?></p>
        <?php endif; ?>
        <a href="<?php echo get_permalink(); ?>">подробнее</a>
    </div>
    <?php
} // porfolioOutput
 
function shortcode_portfolio( $atts ) {
    ob_start();
    $data = shortcode_atts( array(
        'limit' => 5, // сколько отображать portfolio за раз
        'exclude' => '', // id портфолио которые не стоит включать в вывод строкой через запятую. Пример: 1,15,26
    ), $atts );
    ?>
    <div class="grid grid-tab p-t-130">
        <div class="col-1-1">
            <h2>последние работы</h2>
        </div>
    </div>
    <div class="grid grid-tab p-lr-130 portfolio-nav">
        <button type="submit" class="prev"></button>
        <button type="submit" class="next"></button>
 
        <input type="hidden" name="limit" value="<?php echo esc_attr( $data['limit'] ); ?>" />
        <input type="hidden" name="exclude" value="<?php echo esc_attr( $data['exclude'] ); ?>" />
        <input type="hidden" name="page" value="0" />
 
        <div class="portfolio-wrapper">
            <?php $portfolio = queryPortfolio( 0, $data['limit'], $data['exclude'] );
            if ( $portfolio->have_posts() ) :
                while ( $portfolio->have_posts() ) : $portfolio->the_post();
                    porfolioOutput();// Вместо этой функции можно использовать get_template_part
                endwhile;
            endif;
            wp_reset_query(); ?>
        </div>
    </div><?php
    return ob_get_clean();
} // shortcode_portfolio
 
add_shortcode('shortcode_portfolio', 'shortcode_portfolio');
 
add_action( 'wp_footer', 'prev_action', 99 );
function prev_action() {
    ?>
    <script type="text/javascript" >
    ( function( $ ) {
        var $portfolio = $('.portfolio-nav');
        if( ! $portfolio || $portfolio.length === 0 ) return;
 
        var $limit = $portfolio.find( 'input[name="limit"]');
        var $exclude = $portfolio.find( 'input[name="exclude"]');
        var $page = $portfolio.find( 'input[name="page"]');
 
        var $wrapper = $portfolio.find( '.portfolio-wrapper' );
 
        function getPortfolios( prev ) {
            prev = ( undefined === prev ) ? true : !! prev;
            var page = parseInt( $page.val() );
            page = ( prev ) ? page - 1 : page + 1;
            $.ajax( {
                type       : "POST",
                data       : {
                    action: 'my_get_portfolios',
                    limit : $limit.val(),
                    exclude : $exclude.val(),
                    page: page
                },
                url        : <?php echo admin_url( 'admin-ajax.php') ?>,
                success: function( data ){
                    if( ! data.success ) {
                        if( data.error ) console.log( data.error );
                        return;
                    }
                    $page.val( data.page );
                    $wrapper.html( data.html );
                }
            });
        }
 
        $portfolio.on( 'click', 'button.prev', function( event ) {
            event.preventDefault();
            getPortfolios( true );
        } );
 
        $portfolio.on( 'click', 'button.next', function( event ) {
            event.preventDefault();
            getPortfolios( false );
        } );
    } )( jQuery || window.jQuery );
    </script>
<?php }
 
add_action('wp_ajax_my_get_portfolios', 'my_get_portfolios_callback');
add_action('wp_ajax_nopriv_my_get_portfolios', 'my_get_portfolios_callback');
function my_get_portfolios_callback() {
    if( ! isset( $_POST ) || ! isset( $_POST['limit'] ) || ! isset( $_POST['exclude'] ) || ! isset( $_POST['page'] ) )
        wp_send_json_error( array( 'error' => 'not enought data sendt' ) );
 
    $limit = (int) $_POST['limit'];
    $exclude = (string) $_POST['exclude'];
    $page = (int) $_POST['page'];
 
    ob_start();
    $portfolio = queryPortfolio( $page, $limit, $exclude );
    if ( $portfolio->have_posts() ) :
        while ( $portfolio->have_posts() ) : $portfolio->the_post();
            porfolioOutput();// Вместо этой функции можно использовать get_template_part
        endwhile;
    else:
        echo '<h2>No more portfolios</h2>';
    endif;
    wp_reset_query();
    $html = ob_get_clean();
 
    wp_send_json_success( array(
        'page' => $page,
        'html' => $html
    ) );
}
ЗЫ: я не проверял, но по идеи должно всё работать
1
14 / 14 / 2
Регистрация: 04.08.2014
Сообщений: 121
08.06.2016, 19:38  [ТС]
Я в общем допилил свой вариант до рабочего

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
<?php
/**
 * sharkz_theme functions and definitions.
 *
 * @link https://developer.wordpress.org/themes/basics/theme-functions/
 *
 * @package sharkz_theme
 */
 
add_action('init', 'portfolio');
function portfolio()
{
  $labels = array(
    'name' => 'Портфолио',
    'singular_name' => 'Портфолио',
    'add_new' => 'Добавить элемент',
    'add_new_item' => 'Добавить новый элемент',
    'edit_item' => 'Редактировать элемент',
    'new_item' => 'Новый элемент',
    'view_item' => 'Посмотреть элемент',
    'search_items' => 'Найти элемент',
    'not_found' =>  'Элемент не найден',
    'not_found_in_trash' => 'В корзине Элемнты не найдены',
    'parent_item_colon' => '',
    'menu_name' => 'Портфолио'
  );
 
  $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'query_var' => true,
    'rewrite' => true,
    'capability_type' => 'post',
    'has_archive' => true,
    'hierarchical' => false,
    'menu_position' => 5,
    'supports' => array('title', 'custom-fields'),
    'taxonomies' => array('portfolio'),
  );
  register_post_type('portfolio',$args);  
}
 
function shortcode_portfolio() {    
    global $wpdb; 
    $portfolio_arr = $wpdb->get_results( " SELECT ID FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'portfolio' AND ID IS NOT NULL" );
    if( $portfolio_arr ) {
        foreach ( $portfolio_arr as $portfolio_item ) {
            $portfolio_id_arr[] += $portfolio_item->ID;
        }
    }
    $_SESSION["i"] = 0;
    ?>  
 
    <input type="hidden" name="current_page" value="<?php echo $_SESSION["i"];?>" >
    <?php
    $i_max = count($portfolio_id_arr) - 1;
 
    for ($y = 0; $y < 3; $y++) { 
        if ( $_SESSION["i"] <= $i_max && $_SESSION["i"] > -1 ) {
          $portfolio_id_arr_3el[] += $portfolio_id_arr[$_SESSION["i"]];
          $_SESSION["i"]++;
        } else {
          $_SESSION = 0;
          $portfolio_id_arr_3el[] += $portfolio_id_arr[$_SESSION["i"]];
          $_SESSION["i"]++;
        }
    }
    ?>
    <div class="grid grid-tab p-t-130"> 
        <div class="col-1-1">
            <h2>последние работы</h2>
        </div>      
    </div>
    <div class="grid grid-tab p-lr-130 portfolio-nav">
    <button type="submit" class="prev"></button>
    <button type="submit" class="next"></button>
    
    <?php   
        $portfolio = new WP_Query( array('post__in' => $portfolio_id_arr_3el ,  'post_type' => 'portfolio', 'order' => 'ASC') ); 
        if ( $portfolio->have_posts() ) :
            while ( $portfolio->have_posts() ) :                
                    $portfolio->the_post(); 
 
                    $portfolio_img = get_field('portfolio-img');
                    $portfolio_title = get_field('portfolio-title');
                    $portfolio_descr = get_field('portfolio-descr');
                    ?>
                        <div class="col-1-3 service portfolio">                     
                            <?php
                            if( !empty($portfolio_img) ): ?>
                            <img src="<?php echo $portfolio_img['url']; ?>" alt="<?php echo $portfolio_img['alt']; ?>" title="<?php echo $portfolio_img['title']; ?> "  />
                            <?php endif;
                            if( !empty($portfolio_title) ): ?>
                                <h3> <?php echo $portfolio_title; ?> </h3>
                            <?php endif;
                            if( !empty($portfolio_descr) ): ?>
                                <p> <?php echo $portfolio_descr; ?> </p>
                            <?php endif; ?>
                                <a href="<?php echo get_permalink(); ?>"> подробнее </a>
                        </div>                                                  
        <?php   endwhile;
            endif;
        wp_reset_query(); ?>
     </div> 
    
<?php }
 
add_shortcode('shortcode_portfolio', 'shortcode_portfolio');
 
add_action('wp_footer', 'prev_action', 99); 
function prev_action() {
    ?>
    <script type="text/javascript" >    
    var current_page = $("input[name='current_page']").val();
    $(function(){
        $('.prev').on('click',function(e){
            e.preventDefault();
            $.ajax({
                type       : "POST",
                data       : {
                action: 'prevcall',
                action_page : 'prev', 
                page : current_page,
                },
                url        : myajax.ajaxurl,
                success:function(html){ 
                current_page++;     
                $("input[name='current_page']").val(current_page);
                $(".portfolio-nav").children(".portfolio").remove();
                $(".portfolio-nav").append(html);
            }
            });
        });
        $('.next').on('click',function(e){
            e.preventDefault();
            $.ajax({
                type       : "POST",
                data       : {
                action: 'nextcall', 
                action_page : 'next', 
                page : current_page,
                },
                url        : myajax.ajaxurl, 
                success:function(html){
                current_page--;     
                $("input[name='current_page']").val(current_page);
                $(".portfolio-nav").children(".portfolio").remove();
                $(".portfolio-nav").append(html);
            }
            });
        });
    });
    </script>
<?php }
 
add_action('wp_ajax_nextcall', 'next_callback');
add_action('wp_ajax_nopriv_nextcall', 'next_callback');
function next_callback() {
    $_SESSION["i"] = $_POST['page'] - 1;
    global $wpdb; 
    $portfolio_arr = $wpdb->get_results( " SELECT ID FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'portfolio' AND ID IS NOT NULL" );
    if( $portfolio_arr ) {
        foreach ( $portfolio_arr as $portfolio_item ) {
            $portfolio_id_arr[] += $portfolio_item->ID;
        }
    }
    $i_max = count($portfolio_id_arr) - 1;
 
    for ($y = 0; $y < 3; $y++) { 
        if ( $_SESSION["i"] <= $i_max && $_SESSION["i"] > -1 ) {
          $portfolio_id_arr_3el[] += $portfolio_id_arr[$_SESSION["i"]];
          $_SESSION["i"]++;
        } else {
          $_SESSION["i"] = $_SESSION["i"]%$i_max;
          $portfolio_id_arr_3el[] += $portfolio_id_arr[$_SESSION["i"]];
          $_SESSION["i"]++;
        }
    }
        
    $portfolio = new WP_Query( array('post__in' => $portfolio_id_arr_3el ,  'post_type' => 'portfolio', 'order' => 'ASC') ); 
        if ( $portfolio->have_posts() ) :
            while ( $portfolio->have_posts() ) :                
                    $portfolio->the_post(); 
 
                    $portfolio_img = get_field('portfolio-img');
                    $portfolio_title = get_field('portfolio-title');
                    $portfolio_descr = get_field('portfolio-descr');
                    ?>
                        <div class="col-1-3 service portfolio">                     
                            <?php
                            if( !empty($portfolio_img) ): ?>
                            <img src="<?php echo $portfolio_img['url']; ?>" alt="<?php echo $portfolio_img['alt']; ?>" title="<?php echo $portfolio_img['title']; ?> "  />
                            <?php endif;
                            if( !empty($portfolio_title) ): ?>
                                <h3> <?php echo $portfolio_title; ?> </h3>
                            <?php endif;
                            if( !empty($portfolio_descr) ): ?>
                                <p> <?php echo $portfolio_descr; ?> </p>
                            <?php endif; ?>
                                <a href="<?php echo get_permalink(); ?>"> подробнее </a>
                        </div>                                                  
        <?php   endwhile;
            endif;
        wp_reset_query(); ?>
     </div> 
    
<?php 
    wp_die();
}
add_action('wp_ajax_prevcall', 'prev_callback');
add_action('wp_ajax_nopriv_prevcall', 'prev_callback');
function prev_callback() {
    $_SESSION["i"] = $_POST['page'] + 1;
 
    global $wpdb; 
    $portfolio_arr = $wpdb->get_results( " SELECT ID FROM $wpdb->posts WHERE post_status = 'publish' AND post_type = 'portfolio' AND ID IS NOT NULL" );
    if( $portfolio_arr ) {
        foreach ( $portfolio_arr as $portfolio_item ) {
            $portfolio_id_arr[] += $portfolio_item->ID;
        }
    }
    $i_max = count($portfolio_id_arr) - 1;
 
    for ($y = 0; $y < 3; $y++) { 
        if ( $_SESSION["i"] <= $i_max && $_SESSION["i"] > -1 ) {
          $portfolio_id_arr_3el[] += $portfolio_id_arr[$_SESSION["i"]];
          $_SESSION["i"]++;
        } else {
          $_SESSION["i"] = 0;
          $portfolio_id_arr_3el[] += $portfolio_id_arr[$_SESSION["i"]];
          $_SESSION["i"]++;
        }
    }
        
    $portfolio = new WP_Query( array('post__in' => $portfolio_id_arr_3el ,  'post_type' => 'portfolio', 'order' => 'ASC') ); 
        if ( $portfolio->have_posts() ) :
            while ( $portfolio->have_posts() ) :                
                    $portfolio->the_post(); 
 
                    $portfolio_img = get_field('portfolio-img');
                    $portfolio_title = get_field('portfolio-title');
                    $portfolio_descr = get_field('portfolio-descr');
                    ?>
                        <div class="col-1-3 service portfolio">                     
                            <?php
                            if( !empty($portfolio_img) ): ?>
                            <img src="<?php echo $portfolio_img['url']; ?>" alt="<?php echo $portfolio_img['alt']; ?>" title="<?php echo $portfolio_img['title']; ?> "  />
                            <?php endif;
                            if( !empty($portfolio_title) ): ?>
                                <h3> <?php echo $portfolio_title; ?> </h3>
                            <?php endif;
                            if( !empty($portfolio_descr) ): ?>
                                <p> <?php echo $portfolio_descr; ?> </p>
                            <?php endif; ?>
                                <a href="<?php echo get_permalink(); ?>"> подробнее </a>
                        </div>                                                  
        <?php   endwhile;
            endif;
        wp_reset_query(); ?>
     </div> 
    
<?php 
    wp_die();
}
За советы по оптимизации и улучшению, буду благодарен

Добавлено через 1 минуту
И есть еще од НО
PHP
1
2
3
4
5
6
7
8
9
10
for ($y = 0; $y < 3; $y++) { 
        if ( $_SESSION["i"] <= $i_max && $_SESSION["i"] > -1 ) {
          $portfolio_id_arr_3el[] += $portfolio_id_arr[$_SESSION["i"]];
          $_SESSION["i"]++;
        } else {
          $_SESSION["i"] = 0;
          $portfolio_id_arr_3el[] += $portfolio_id_arr[$_SESSION["i"]];
          $_SESSION["i"]++;
        }
    }
тупит при записи в массив, когда доходит до его конца
0
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
08.06.2016, 19:38
см. мой ответ выше, там всё "оптимизированно" на сколько возможно, всё по назначению и т.п. )))
0
14 / 14 / 2
Регистрация: 04.08.2014
Сообщений: 121
08.06.2016, 19:38  [ТС]
идея в том что есть массив из [1,2,3,4,5]
сначала выводим первые [1,2,3]
потом +1 и получаем массив [2,3,4]
потом +1 и получаем массив [3,4,5]
потом +1 и получаем массив [4,5,1]
И так по кргу в перед и назад, буд благодарен за помощь!
0
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
08.06.2016, 19:45
в моём коде где 'offset' => $page * $limit,
поменяй на 'offset' => $page

Но это будет выводить 2,3,4 ... 3,4,5.. 4, 5... 5..

В любом случа - делаешь логику в функции queryPortfolio как тебе нужно, имея параметры $page ( 0, 1, 2, 3 и т.п. ), $limit = сколько записей отображать

из этих параметров можешь заполнить $args массив как нужно и будет выводить нужные посты
0
14 / 14 / 2
Регистрация: 04.08.2014
Сообщений: 121
08.06.2016, 19:49  [ТС]
не работает, в консоле ошибок нет

Добавлено через 59 секунд
Я все-таки зациклить его хочу, просто базы в программировании не хватает на это(
0
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
08.06.2016, 19:51
А вообще подобную логику можно реализовать не прибегая к ajax.. просто выводишь все записи и прячешь лишнии и с помощью js делаешь карусель которая будет отображать следующие или предыдущие портфолио..
0
14 / 14 / 2
Регистрация: 04.08.2014
Сообщений: 121
08.06.2016, 19:55  [ТС]
muxahuk1214, да, конечно, это было моим плано Б. Я пошел таким путем из соображений, что записей может быть и 500 и это будет лишней нагрузкой на клиента
0
Coding is art
Эксперт JS
540 / 423 / 154
Регистрация: 04.09.2013
Сообщений: 1,066
08.06.2016, 20:00
поверьте, лучше нагрузить клинета, чем север.. ведь каждый запрос это поедание трафика.. представьте что 1000 посетителей в день делают по 500 запросов для получения инфы через аякс.. трафик ужастный.. и это только 1-н минус, а их куда больше..
и тут именно аякс должен быть планом Б, а не наоборот..

Вы можете показывать первые 50 записей, а когда чел-к дойдёт до 49 - подгружать ещё 50 записей через ajax
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.06.2016, 20:00
Помогаю со студенческими работами здесь

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

Как сделать пагинацию
Есть контроллер типа public ViewResult Clients() { var Clientdatas = db.Clientdatas; return...

Как сделать пагинацию
Как сделать так чтоб выводились на страницы только 50 статей, потом при нажатие на кнопку Показать больше выводились еще 50 статей и так...

Как сделать пагинацию таблицы?
есть таблица, но она долго грузиться. Как разбить таблицу на части, чтоб грузилось,например, по 10 елементов.

DataGridView Как сделать пагинацию?
Привет, подскажите как можно реализовать пагинацию что бы она работала в datagridview, может есть готовые решения


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru