WordPress
■ カスタム投稿ループ処理(繰り返しフィールド)
<?php if(have_rows('repeater_field_name')): ?>
<?php while(have_rows('repeater_field_name')): the_row(); ?>
<?php the_sub_field('sub_field_name'); ?>
<?php endwhile; ?>
<?php endif; ?>
■ カスタム投稿の出力
<?php
$args = array(
'paged' => $paged,
'post_type' => 'test-post', //①カスタム投稿名 (通常の「投稿」はpost)
'taxonomy' => 'test-cat', //②タクソノミー名を指定 (通常の「投稿」はcategory)
'field' => 'slug', //'term_id'、'slug'など、次の term を指定するフィールド名を指定
'term' => 'test', //③タームを指定
//'terms' => array('test','test2'), //③タームを指定 (複数の場合)
'posts_per_page' => 6, //表示数を指定
);
$the_query = new WP_Query($args); if($the_query->have_posts()):
?>
<?php while ($the_query->have_posts()): $the_query->the_post(); ?>
<!-- 内容を記載 -->
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<div class="pnavi">
<?php //ページリスト表示処理
global $wp_rewrite;
$paginate_base = get_pagenum_link(1);
if(strpos($paginate_base, '?') || ! $wp_rewrite->using_permalinks()){
$paginate_format = '';
$paginate_base = add_query_arg('paged','%#%');
}else{
$paginate_format = (substr($paginate_base,-1,1) == '/' ? '' : '/') .
user_trailingslashit('page/%#%/','paged');
$paginate_base .= '%_%';
}
echo paginate_links(array(
'base' => $paginate_base,
'format' => $paginate_format,
'total' => $the_query->max_num_pages,
'mid_size' => 1,
'current' => ($paged ? $paged : 1),
'prev_text' => '< 前へ',
'next_text' => '次へ >',
)); ?>
</div>
<div class="list-link">
<a class="link-btn opa anime" href="<?php echo home_url(); ?>">トップへ</a>
</div>
<?php else: ?>
<p>現在、投稿がありません</p>
<?php endif; ?>
■ URL取得(画像やファイル読み込みの際)
<?php echo get_template_directory_uri(); ?>
■ パラメータのついたURLのリダイレクト(パラメータを削除する)
<?php
if (!empty($_GET["パラメータの値(?と=の間)"])) {
if ($_GET["パラメータの値(?と=の間)"] == "") {
header("HTTP/1.1 301 Moved Permanently");
header('Location: '.home_url(id=以下のURLを記述).'/ディレクトリがあれば記載');
exit;
}
}
?>
■ プラグイン使用時などに用いるショートコードの呼び出し方
<?php echo do_shortcode('[ショートコードの文字列]'); ?>
■ Laravelにおけるファイルの追いかけ方
手順書
▼「route/web.php」を見る
┗ここにURLの定義が記載されていて、どのコントローラを見に行けば良いか書いてある
Route::get('/shop/detail/blog/{permalink}', 'BlogController@detail');
・'/shop/detail/blog/{permalink}' →URLをどのように定義しているか
・ 'BlogController@detail' → どこのコントローラーを見るべきか
・get →ここも確認。get、postによって変わってくる
▼「app/Http/Controllers」ディレクトリを見に行く
┗先ほど見た「'BlogController@detail'」の@より前の値のついたファイルを見る
@より後ろに書かれた値で定義されているfunctionを見る
return view('blog.detail',$__viewData);
▼「resources/views」ディレクトリを見に行く
・「return view」の「'blog.detail'」に注目して、「.」より前の値のディレクトリを確認
・後半の文字のついたファイルを開く
→ここがHTMLの記載があるファイル
▼補足
@extends('layouts.standard')
で書かれた「layouts.standard」は「/resources/views」ディレクトリの「layouts」ディレクトリの「standard」ファイルを指す。
参考url
■ 文字数制限付きの投稿の出力
// カスタム投稿のテキストエリアの場合
<?php if(mb_strlen(get_field('リフォームの説明'))>40) {
$hoge= mb_substr(get_field('リフォームの説明'),0,39) ;
echo $hoge.'…';
} else {
echo get_field('リフォームの説明');
}
?>
■ 記事一覧にタクソノミータイトルを表示
<?php single_term_title(); ?>
■ カスタム投稿で同日の場合は同一のものは出力されないので、そちらの解決策
<?php the_time('Y.m.d'); ?>
■ カスタム投稿の有無で出しわけ
<?php if(post_custom('フィールド名')): ?>
<?php the_field('フィールド名') ?>
<?php endif; ?>
■ 本番移行について(ドメインを新規で取得した場合)
▼サーバーとドメインを取得したそれぞれの紐付けが必要
例)エックスサーバーとお名前の場合
・エックスサーバー へドメインの追加
・お名前.comにネームサーバーを追加する(念のため、全て)
┗反映に時間がかかるので注意
▼ドメインを叩いた時にサーバーの初期画面が表示されていれば紐付け完了!
(予めできているところもあったりするので、はじめにドメインを叩いて確認すること)
↓
▼紐付けが完了したら、開発環境で作成したデータを移管するだけ!
■ tableで共通の値の時、セルを結合させる方法(一番目のセルのみ)
$(function(){
$($('.worksTable tr').get().reverse()).each(function(){
if($(this).prev('tr').length>0){
var pre=$(this).prev('tr').find('td:eq(0)');
var self=$(this).find('td:eq(0)');
if(pre.text()==self.text()){
pre.attr('rowspan',parseInt(self.attr('rowspan')||"1")+1);
self.remove();
}
}
});
});
■ 著作クレジットについて(カスタム投稿の場合)
//投稿者の選択項目欄がないので下記のコードをfunction.phpに追加
//追加コード(カスタム投稿へ投稿者選択を表示させる)
add_action('admin_menu', 'myplugin_add_custom_box');
function myplugin_add_custom_box() {
if (function_exists('add_meta_box')) {
add_meta_box('myplugin_sectionid',
__('作成者', 'myplugin_textdomain'),
'post_author_meta_box',
'カスタム投稿名(blog)',
'advanced'
);
}
}
■ 記事内容を文字数制限して一覧表示する方法
<?php
if(mb_strlen($post->post_content,'UTF-8')>73){
$content= str_replace('\n', '', mb_substr(strip_tags($post-> post_content), 0, 73,'UTF-8'));
echo $content.'……';
}else{
echo str_replace('\n', '', strip_tags($post->post_content));
}
?>
参考url
■ noindex, nofollow
<meta name="robots" content="noindex,nofollow">
■ 記事のURLを連番にする方法(functions.phpに追加)
/*$post_type のところに該当の記事のスラッグを追加する
/* 投稿記事のスラッグをID番号で採番 */
function custom_auto_post_slug( $slug, $post_ID, $post_status, $post_type ) {
if ( $post_type == 'column' ) {
$slug = $post_ID;
}
return $slug;
}
add_filter( 'wp_unique_post_slug', 'custom_auto_post_slug', 10, 4 );
■ カスタム投稿に「投稿者」の表示をさせる方法(functions.phpに追加)
/*「投稿タイプスラッグ」にはカスタム投稿のスラッグを記入
add_action('admin_menu', 'myplugin_add_custom_box');
function myplugin_add_custom_box() {
if (function_exists('add_meta_box')) {
add_meta_box('myplugin_sectionid', __('作成者', 'myplugin_textdomain'),
'post_author_meta_box', 'column', 'advanced');
}
};
■ カスタム投稿一覧ページでの、ページネーションの作り方(関数var)
<?php the_posts_pagination(
array(
'mid_size' => 1, // 現在ページの左右に表示するページ番号の数
'prev_next' => true, // 「前へ」「次へ」のリンクを表示する場合はtrue
'prev_text' => ( '<<'), // 「前へ」リンクのテキスト
'next_text' => ( '>>'),// 「次へ」リンクのテキスト
'type' => 'list', // 戻り値の指定 (plain/list)
)
); ?>
■ カスタムフィールドの情報を出力
参考url
■ カテゴリー名を出力
<?php if ($terms = get_the_terms($post->ID, 'category1')) {
foreach ( $terms as $term ) {
$term_slug = $term->slug;
}
} ?>
<p class="f12 icon <?php echo $term->slug ?>"><?php echo esc_html($term->name);?></p>
■ カスタム投稿コンテンツごとにアーカイブページの表示件数を変更する方法
function change_posts_per_page($query) {
if ( is_admin() || ! $query->is_main_query() )
return;
if ( $query->is_post_type_archive('works') ) { /* アーカイブページworksの時に表示件数を6件にセット */
$query->set( 'posts_per_page', '6' );
}
elseif ( $query->is_post_type_archive('news') ) { /* アーカイブページnewsの時に表示件数を10件にセット */
$query->set( 'posts_per_page', '10' );
}
}
add_action( 'pre_get_posts', 'change_posts_per_page' );
:::details
:::■ WordPress(プラグイン集)
・カスタムフィールド
Advanced Custom Fields PRO
・カスタム投稿およびタクソノミー
Custom Post Type UI
・フォーム
MW WP Form
・キャッシュクリア
WP Fastest Cache
・投稿などを複製できるようになる
Yoast Duplicate Post
・タクソノミーの順番をかえるプラグイン
Category Order and Taxonomy Terms Order
■ 投稿のアイキャッチ画像のurlを取得
<?php if(has_post_thumbnail()): ?>
<a href="<?php the_permalink(); ?>" style="background-image: url(<?php the_post_thumbnail_url(); ?>)">
<?php elseif: ?>
// アイキャッチ画像がない場合の処理をここに書く
<?php endif; ?>
■ 投稿の日付を取得する
<?php
$days = 3;
$today = date_i18n('U');
$entry_day = get_the_time('U');
$keika = date('U', ($today - $entry_day)) / 86400;
if ($days > $keika) :
echo 'new';
endif; ?>
■ 投稿の文字列出力で文字数制限をする
<?php echo wp_trim_words(get_the_title(), 30, '...'); ?>
■ Custom Post Type UIのタクソノミー(カテゴリー)を投稿画面でチェックボックス(選択できるようにする)設定
■ サブループ終了時にリセット
<?php endwhile; ?>
<?php wp_reset_postdata(); ?> // <---これ
<?php endif; ?>
■ アーカイブページが複数存在する場合に、条件分岐をするテンプレートタグ
<?php if ( is_post_type_archive('news') ) : ?>
■ カスタムフィールドのテキストエリアなどで改行も一緒に反映させる方法
<?php echo nl2br(get_post_meta($post->ID, 'フィールド名', true)); ?>
■ 投稿年と投稿月で絞り込みをして出力
<?php
for ($year = $thisyear; $year >= 2018; $year--) { ?> <!-- 現在の西暦(2022)から2018までループで回す -->
<div class="contents__box" id="contents__<?php echo $year; ?>">
<?php
for ($i = 1; $i < 13; $i++) { //これで12回ループさせる(12ヶ月を意味する)
$args = array(
'paged' => $paged,
'post_type' => 'financial_statements',
'posts_per_page' => -1, //投稿全件表示
'year' => $year, //投稿年を現在回している$yearに絞り込む
'monthnum' => $i //投稿月を現在回している$iに絞り込む
); //取得する記事の条件を作る
$the_query = new WP_Query($args); //作成した条件をもとに該当の記事を取得して $the_query に配列として入れる
if ($the_query->have_posts()) { //記事があるかどうかの判定
echo '<h3 class="contents__title Noto_b c__white2">' . $year . '年' . $i . '月期</h3>'; //記事があるたびに出力する必要はないのでサブループの外にかく
while ($the_query->have_posts()) { //記事がある分だけループさせる
$the_query->the_post(); //「この」記事を取ってくる
echo '<div class="contents">
<div class="item__box">
<p class="date">'
. get_the_date() .
'</p>
<p class="text c__white">'
. get_the_title() .
'</p>
</div>
</div>';
}
}
wp_reset_postdata(); //該当の条件で取ってきた記事をリセットする
}
?>
</div>
<?php } ?>
■ カスタムタクソノミー前表示したいときに、表示順番をカスタムフィールドを用いて、自由に変更する
usort($terms2, function ($a, $b) {
return get_field("表示順", "category_" . $a->term_id)
- get_field("表示順", "category_" . $b->term_id);
});
参考url
■ カスタム投稿(その投稿が属しているタクソノミー名だけを出力する)
<?php $terms = get_the_terms($post->ID, 'taxonomy名'); foreach($terms as $term){ $term_name = $term->name; echo $term_name; break; }; ?>
■ すべての親ページの情報を取得する(固定ページ)
参考url
■ カスタムフィールド(select)の出力方法
<?php
$select = get_sub_field('glass__sec2__field__item__size');
$value = $select['value'];
?>
参考url
■ カスタムフィールド(数値)でランキング表示する方法
参考url
■ パンくずリスト
// パンくずリストのアイテムの配列を取得します。
function get_breadcrumb_items( $args ) {
global $wp_query;
global $post;
$items = array();
if ( is_front_page() ) {
if ( $args['home'] ) {
$items[] = array( 'title' => $args['home_template'], 'link' => false );
}
return $items;
}
if ( $args['home'] ) {
$items[] = array( 'title' => $args['home_template'], 'link' => home_url( '/' ) );
}
$post_type = get_post_type();
if ( 'post' === $post_type && ! is_search() ) {
if ( $blog_id = get_option( 'page_for_posts' ) ) {
$items[] = array( 'title' => get_the_title( $blog_id ), 'link' => get_page_link( $blog_id ) );
}
} else {
if ( is_post_type_archive() ) {
$items[] = array( 'title' => post_type_archive_title( null, false ), 'link' => false );
}
}
if ( is_home() ) {
$items[] = array( 'title' => wp_title( '', false ), 'link' => false );
} elseif ( is_single() ) {
/*
* Single Post page.
*/
$post_type = get_post_type( $post->ID );
if ( 'post' === $post_type ) {
/*
* Post page.
*/
if ( $cats = get_the_category( $post->ID ) ) {
$current_cat = null;
foreach ( $cats as $cat ) {
if ( ! $current_cat || cat_is_ancestor_of( $current_cat, $cat ) ) {
$current_cat = $cat;
}
}
if ( $current_cat->parent ) {
$ancestor_cat_ids = array_reverse( get_ancestors( $current_cat->cat_ID, 'category' ) );
foreach ( $ancestor_cat_ids as $cat_id ) {
$items[] = array( 'title' => get_cat_name( $cat_id ), 'link' => get_category_link( $cat_id ) );
}
}
$items[] = array( 'title' => get_cat_name( $current_cat->cat_ID ), 'link' => get_category_link( $current_cat->cat_ID ) );
}
} else {
/*
* Custom Post Type page.
*/
$post_type_object = get_post_type_object( $post->post_type );
if ( false !== $post_type_object->has_archive ) {
$items[] = array( 'title' => $post_type_object->labels->name, 'link' => get_post_type_archive_link( get_post_type() ) );
}
}
$strtitle = the_title( '', '', false );
if ( ! isset( $strtitle ) || $strtitle == '' ) {
$strtitle = $post->ID;
}
$items[] = array( 'title' => $strtitle, 'link' => false );
} elseif ( is_category() ) {
/*
* Category archive page.
*/
$cat = get_queried_object();
if ( $cat->parent ) {
$ancestor_cat_ids = array_reverse( get_ancestors( $cat->cat_ID, 'category' ) );
foreach ( $ancestor_cat_ids as $cat_id ) {
if ( ! in_array( $cat_id, $args['exclude_categorys'] ) ) {
$items[] = array( 'title' => get_cat_name( $cat_id ), 'link' => get_category_link( $cat_id ) );
}
}
}
$items[] = array( 'title' => $cat->cat_name, 'link' => false );
} else if ( is_tag() ) {
/*
* Tag archive page.
*/
$tag_id = get_query_var( 'tag_id' );
$tag = get_tag( $tag_id );
if ( $tag ) {
$items[] = array( 'title' => $tag->name, 'link' => false );
}
} elseif ( is_tax() ) {
/*
* Taxonomy archive page.
*/
$query_obj = get_queried_object();
$post_types = get_taxonomy( $query_obj->taxonomy )->object_type;
$cpt = $post_types[0];
$items[] = array( 'title' => get_post_type_object( $cpt )->label, 'link' => get_post_type_archive_link( $cpt ) );
$taxonomy = get_query_var( 'taxonomy' );
$term = get_term_by( 'slug', get_query_var( 'term' ), $taxonomy );
if ( is_taxonomy_hierarchical( $taxonomy ) && $term->parent != 0 ) {
$ancestors = array_reverse( get_ancestors( $term->term_id, $taxonomy ) );
foreach ( $ancestors as $ancestor_id ) {
$ancestor = get_term( $ancestor_id, $taxonomy );
$items[] = array( 'title' => $ancestor->name, 'link' => get_term_link( $ancestor, $term->slug ) );
}
}
$items[] = array( 'title' => $term->name, 'link' => false );
} elseif ( is_year() ) {
/*
* Year archive page.
*/
$items[] = array( 'title' => get_the_time( _x( 'Y', 'breadcrumb year format', 'jp-for-twentytwentyone' ) ), 'link' => false );
} elseif ( is_month() ) {
/*
* Month archive page.
*/
$items[] = array( 'title' => get_the_time( _x( 'Y', 'breadcrumb year format', 'jp-for-twentytwentyone' ) ), 'link' => get_year_link( get_the_time( 'Y' ) ) );
$items[] = array( 'title' => get_the_time( _x( 'F', 'breadcrumb month format', 'jp-for-twentytwentyone' ) ), 'link' => false );
} elseif ( is_date() ) {
/*
* Date archive page.
*/
$items[] = array( 'title' => get_the_time( _x( 'Y', 'breadcrumb year format', 'jp-for-twentytwentyone' ) ), 'link' => get_year_link( get_the_time( 'Y' ) ) );
$items[] = array( 'title' => get_the_time( _x( 'F', 'breadcrumb month format', 'jp-for-twentytwentyone' ) ), 'link' => get_month_link( get_the_time( 'Y' ), get_the_time( 'm' ) ) );
$items[] = array( 'title' => get_the_time( _x( 'd', 'breadcrumb day format', 'jp-for-twentytwentyone' ) ), 'link' => false );
} elseif ( is_page() ) {
/*
* Single page.
*/
$post = $wp_query->get_queried_object();
if ( $post->post_parent == 0 ) {
$items[] = array( 'title' => get_the_title( '', '', true ), 'link' => false );
} else {
$ancestors = array_reverse( get_post_ancestors( $post->ID ) );
array_push( $ancestors, $post->ID );
foreach ( $ancestors as $ancestor ) {
$strtitle = get_the_title( $ancestor );
if ( ! isset( $strtitle ) || $strtitle == '' ) {
$strtitle = $post->ID;
}
if ( $ancestor != end( $ancestors ) ) {
$items[] = array( 'title' => strip_tags( apply_filters( 'single_post_title', $strtitle ) ), 'link' => get_permalink( $ancestor ) );
} else {
$items[] = array( 'title' => strip_tags( apply_filters( 'single_post_title', $strtitle ) ), 'link' => false );
}
}
}
} elseif ( is_search() ) {
/*
* Search page.
*/
$items[] = array( 'title' => __( 'Search Results', 'jp-for-twentytwentyone' ), 'link' => false );
} elseif ( is_404() ) {
/*
* 404 page.
*/
$items[] = array( 'title' => __( '404', 'jp-for-twentytwentyone' ), 'link' => false );
}
return $items;
}
// パンくずリストを取得します。
function get_breadcrumb( $args = array() ) {
$defaults = array(
'before' => '<nav id="breadcrumb" role="navigation" class="alignwide">',
'after' => '</nav>',
'home' => true,
'home_template' => 'TOP',
'exclude_categorys' => array()
);
$args = wp_parse_args( $args, $defaults );
$items = get_breadcrumb_items( $args );
$html = $args['before'];
$html .= '<ul itemscope itemtype="https://schema.org/BreadcrumbList" class="breadcrumbs">';
foreach ( $items as $index => $item ) {
$html .= '<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">';
if ( $item['link'] ) {
$html .= '<a itemprop="item" href="' . $item['link'] . '"><span itemprop="name">' . $item['title'] . '</span></a>';
} else {
$html .= '<span itemprop="name">' . $item['title']. '</span>';
}
$html .= '<meta itemprop="position" content="' . ( $index + 1 ) . '" />';
$html .= '</li>';
}
$html .= '</ul>';
$html .= $args['after'] . "\n";
return $html;
}
// パンくずリストを表示します。
function breadcrumbs( $args ) {
echo get_breadcrumb( $args );
}
■ カスタム投稿(詳細ページにて属しているタクソノミー全取得)
<?php
$terms = get_terms('cat_works');
foreach( $terms as $term ) {
echo '<li class="catItem f18 yugo-b c_white line_15">'.$term->name.'</li>';
}
?>
■ phpで文字数制限
<?php
//整形したい文字列
$text = get_the_title();
//文字数の上限
$limit = 5;
if(mb_strlen($text) > $limit) {
$title = mb_substr($text,0,$limit);
echo $title.'...';
} else {
echo $text;
}
?>
■ カスタム投稿(タクソノミー表示)
それぞれ投稿に属しているタクソノミーを取得する。
<?php $terms = get_the_terms($args->ID, 'cat_works');
if( !empty( $terms ) ){
foreach($terms as $term) { $term_name = $term->name;
var_dump($term_name);
echo '<li class="catItem f18 yugo-b c_white line_15">'.$term_name.'</li>';
echo '<li class="dots f18 yugo-b c_white line_15">・</li>';
}
}
; ?>
■ デフォルト投稿でカテゴリーを指定して、一覧ページに出力する方法
<?php
$cat_posts = get_posts(array(
'post_type' => 'post', // 投稿タイプ
'category' => 1, // カテゴリIDを番号で指定する場合
'category_name' => 'スラッグ', // カテゴリをスラッグで指定する場合
'posts_per_page' => 6, // 表示件数
'orderby' => 'date', // 表示順の基準
'order' => 'DESC' // 昇順・降順
));
global $post;
if($cat_posts): foreach($cat_posts as $post): setup_postdata($post); ?>
<!-- ループはじめ -->
<h3><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h3>
<p><?php the_category(', ') ?></p>
<p><?php the_time('Y/m/d') ?></p>
<p><?php the_excerpt(); ?></p>
<!-- ループおわり -->
<?php endforeach; endif; wp_reset_postdata(); ?>
参考url
■ 投稿に付けたタグを配列形式で取得する
< 名前だけ取得する >
<?php
$tags = get_the_tags();
foreach ( $tags as $tag ) {
echo '<span>' . $tag->name . '</span>';
}
?>
参考url
■ デフォルト投稿のタグをチェックボックスで選択できるようにする。
functions.phpに記入
<?php
//投稿のタグをチェックボックスで選択できるようにする
function change_post_tag_to_checkbox() {
$args = get_taxonomy('post_tag');
$args -> hierarchical = true;//Gutenberg用
$args -> meta_box_cb = 'post_categories_meta_box';//Classicエディタ用
register_taxonomy( 'post_tag', 'post', $args);
}
add_action( 'init', 'change_post_tag_to_checkbox', 1 );
?>
参考url
■ 一覧表示している投稿の表示投稿数を出力する方法(絞り込みしている際にも対応)
<?php $post_count = $the_query->found_posts; ?>
■ デフォルト投稿一覧でのページネーション
<ul class="box flex_between">
<?php
// Define the paged variable
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$cat_posts = new WP_Query(array(
'paged' => $paged,
'post_type' => 'post',
'category_name' => 'cat_blog',
'posts_per_page' => 5,
'orderby' => 'date',
'order' => 'DESC'
));
if ($cat_posts->have_posts()) : while ($cat_posts->have_posts()) : $cat_posts->the_post(); ?>
<!-- Loop start -->
<li class="item">
<a href="<?php the_permalink(); ?>" class="opa">
<?php if (has_post_thumbnail()) : ?>
<div class="item_img">
<img src="<?php the_post_thumbnail_url(); ?>" alt="">
</div>
<?php endif; ?>
<p class="data_txt f14 c_black02 fw_m sans ln_h125 mt20">
<?php echo get_the_date('Y/m/d'); ?>
</p>
<p class="contents_txt f16 c_black02 fw_m sans ln_h125 mt20">
<?php the_title(); ?>
</p>
</a>
</li>
<!-- Loop end -->
<?php endwhile;?>
<?php else: ?>
<p class="f16 fw_m txt_ctr sans c_black02 ln_h125 py40">
現在ブログはありません。
</p>
<?php endif;?>
<?php wp_reset_postdata();
?>
</ul>
<!-- Pagination -->
<div class="pnavi flex_ctr align_ctr">
<?php
echo paginate_links(array(
'total' => $cat_posts->max_num_pages,
'prev_text' => '<',
'next_text' => '>',
));
?>
</div>
Discussion