WP化する時に、「あれ、タグページのIDってどうやって取得するっけ?検索、検索…」とか毎回やってるなーと思っていたので、この際このページに使うタグは一気に全部載せようと思います。完全な個人用のメモですね。笑
本当に自分がテーマ作る時のスニペット的なものなので引数とか細かい使い方については省略します。
かなり長くなりそうですが、どんなに長くなっても1ページに収めます。笑
随時追加していきます。
//TOPページ
is_front_page()
//固定ページ
is_page()
//投稿ページ
is_single()
//カテゴリーページ
is_category()
//アーカイブページ
is_archive()
//タグページ
is_tag()
//特定のページテンプレート
is_page_template('ページテンプレートのファイル名')
//投稿タイプ
is_singular('投稿タイプ名')
//タクソノミーページ
is_tax()
//著者ページ
is_author()
//日付アーカイブページ
is_date()
//ページネーション2ページ目以降
is_paged()
//検索結果
is_search()
//404ページ
is_404()
//管理画面
is_admin()
//プレビュー画面
is_preview()
//ログインしているかどうか
is_user_logged_in()
//テーマカスタマイザー内かどうか
is_customize_preview()
//header.phpを読み込む
get_header();
//footer.phpを読み込む
get_footer();
//指定したテンプレートファイルを読み込む
get_template_part('テーマスラッグ名', 'テンプレート名');
//searchform.phpを読み込む
get_search_form();
//インクルードしたファイルに変数を渡したい時
//グルーバル変数で渡すか
global $data;
get_template_part('content/about');
//includeする
include locate_template('content/about.php');
//タイトル出力
the_title();
//タイトル取得
get_the_title();
$post->post_title;
//タイトルをaltなどの属性に使うとき
the_title_attribute();
//エディターに書いたコンテンツ出力
the_content();
//エディターに書いたコンテンツ取得
get_the_content();
$post->post_content;
//公開日出力
the_time('Y.m.d'); //2019.09.01
the_time('Y.n.j'); //2019.9.1
//公開日取得
get_the_time('Y.m.d');
//更新日出力
the_modified_time('Y.m.d');
//更新日取得
get_the_modified_time('Y.m.d');
//今日の日付
date_i18n('Y.m.d', current_time('timestamp'));
//パーマリンク出力
the_permalink();
//パーマリンク取得
get_the_permalink();
//アイキャッチ画像出力
if(has_post_thumbnail()){
the_post_thumbnail();
}
//アイキャッチ取得
get_the_post_thumbnail('投稿ID', 'サイズ', '属性オプション');
//前の記事の取得
get_previous_post();
//次の記事の取得
get_next_post();
//前の記事出力
if($prev){
previous_post_link('%link', '文言');
}
//次の記事の出力
if($next){
next_post_link('%link', '文言');
}
//投稿者情報
$author = get_userdata($post->post_author);
//投稿者ID
$author_id = $author->ID;
//投稿者ニックネーム
$author_nicename = get_the_author_meta('user_nicename');
//投稿者ページメタ情報
$author_meta = get_user_meta($auther_id, 'フィールド名', true);
//投稿者ページリンク
$author_link = get_author_posts_url($author_id);
//カテゴリー情報
$category = get_the_category();
//カテゴリーID
$cat_id = $category[0]->cat_ID;
//カテゴリー名
$cat_name = $category[0]->cat_name;
//カテゴリースラッグ
$cat_slug = $category[0]->slug;
//カテゴリーページへのリンク
$cat_link = get_category_link($cat_id);
//タグ情報
$tags = get_the_tags();
if(!empty($tags)){
foreach($tags as $tag) {
//タグID
$tag_id = $tag->term_id;
//タグ名
$tag_name = $tag->name;
//タグページへのリンク
$tag_link = get_tag_link($tag_id);
}
}
//全ての記事数
$max_pages = $wp_query->max_num_pages;
//現在のページ
$current = (get_query_var('paged')) ? get_query_var('paged') : 1;
//投稿タイプ名を出力
post_type_archive_title('', true);
//投稿タイプ名を取得
$archive_title = post_type_archive_title('', false);
//現在のカテゴリーIDを取得
$cat_id = get_query_var('cat');
//カテゴリー名を出力
single_cat_title( '', true );
//カテゴリー名を取得
$cat_title = single_cat_title( '', false );
//現在のタグIDを取得
$tag_id = get_query_var('tag_id');
//タグ名を出力
single_tag_title( '', true );
//タグ名を取得
$tag_title = single_tag_title( '', false );
//現在の投稿者IDを取得
$author_id = get_query_var('author');
//投稿者名
$author_name = get_the_author_meta('user_nicename', $author_id);
//URL
$author_url = get_author_posts_url($author_id);
//サイト内検索を行ったときのクエリ文字列を取得
get_search_query();
//URL出力
home_url('/') //TOPページ https://notes.sharesl.net/
//テーマフォルダのURL
get_theme_file_uri('assets/images/mv.jpg');
//テーマフォルダの絶対パス
get_theme_file_path('assets/images/mv.jpg');
//読み込んだスクリプトにクエリを付けてキャッシュを回避するとき
get_theme_file_uri('script.js?'.filemtime(get_theme_file_path('script.js')));
//特定の投稿の情報を取得
get_post('投稿ID');
//スラッグ名からページを取得
get_page_by_path('スラッグ名');
//ページタイトルからページを取得
get_page_by_title('ページタイトル');
//カスタムフィールドを取得
get_post_meta('投稿ID', 'フィールド名', true);
//カスタムフィールドを更新
update_post_meta('投稿ID', 'フィールド名', '値');
//2連続の改行を<p>タグに置き換える
wpautop($raw_text, true); //trueで1つの改行は<br>に変換
//除外記事用
global $exclude;
$new_args = [
'post_type' => 'post',
'posts_per_page' => 6,
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC',
'post__not_in' => $exclude,
'no_found_rows' => true
];
$new_query = new WP_Query( $new_args );
if ( $new_query->have_posts() ) :
while ( $new_query->have_posts() ) :
$new_query->the_post();
//ページ内で被らないようにする
$exclude[] = $post->ID;
//ループの中身
endwhile;
wp_reset_postdata();
endif;
global $exclude;
//現在のページのカテゴリー情報を取得
$category = get_the_category();
$cat_id = $category[0]->cat_ID;
$args = [
'post_type' => 'post',
'cat' => $cat_id,
'posts_per_page' => 6,
'post_status' => 'publish',
'orderby' => 'date',
'order' => 'DESC',
'post__not_in' => $exclude,
'no_found_rows' => true
];
$query = new WP_Query( $args );
if ( $query->have_posts() ) :
while ( $query->have_posts() ) :
$query->the_post();
//ページ内で被らないようにする
$exclude[] = $post->ID;
//ループの中身
endwhile;
wp_reset_postdata();
endif;
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$args = [
'post_type' => 'post',
'posts_per_page' => 10,
'post_status' => 'publish',
'order' => 'DESC',
'orderby' => 'date',
'paged' => $paged
];
$query = new WP_Query( $args );
if ( $query->have_posts() ) :
while ( $query->have_posts() ) :
$query->the_post();
//ループの中身
endwhile;
wp_reset_postdata();
//ページネーションを追加するラッパー関数
add_pager('p-archive-pager', $query);
endif;
ページネーションを追加する時は簡単なのでWP-PageNaviを使っています。
ただ出力するページが多いといちいち処理を書くのが面倒なので以下のようなラッパー関数を用意しています。
<?php
/*
* wp_pagenaviを追加
* @param String class 付与するclass名
* @param String query wp_query
*/
function add_pager($class = null, $query = null){
if (function_exists('wp_pagenavi')) {
//サブクエリの場合
if (!empty($query)) {
$arg = [
'echo' => false,
'query' => $query
];
}
//メインクエリの場合
else {
$arg = [
'echo' => false
];
}
$pagenavi = wp_pagenavi($arg);
if (!empty($pagenavi)) {
$class = !empty($class) ? $class : ''; ?>
<div class="c-pager<?php echo esc_attr(" ${class}")?>">
<?php
echo $pagenavi; ?>
</div>
<!-- /.c-pager -->
<?php
}
}
}
?>
デフォルトはc-pager
というクラスの付いたdiv要素で囲みます。第一引数でさらに固有のクラス名を追加できます。第2引数はサブループの場合(ここではWP_Query)でページネーションする場合にそのクエリを指定します。
ただ個人的にはページネーションを作るようなページはWP_Queryでサブループを回すとページが重くなるので、固定ページで作らずに素直にアーカイブページやカテゴリーページを作った方が軽くなります。pre_get_posts
でループの内容は制御できますしね。
まぁ知っててもなんでかWP_Query+固定ページで作ってしまって、あとでやり直しみたいな無駄をよくします・・・笑
$args = [
'post_type' => 'post',
'posts_per_page' => 10,
'post_status' => 'publish',
'order' => 'DESC',
'orderby' => 'date',
'meta_key' => 'cf_apple', //カスタムフィールド名
'meta_value' => 1, //カスタムフィールドの値
];
$query = new WP_Query( $args );
if ( $query->have_posts() ) :
while ( $query->have_posts() ) :
$query->the_post();
//ループの中身
endwhile;
wp_reset_postdata();
endif;
$args = [
'post_type' => 'photo',
'posts_per_page' => 10,
'post_status' => 'publish',
'order' => 'DESC',
'orderby' => 'date',
'tax_query' => [
'taxonomy' => 'photo_category', //タクソノミー名
'field' => 'slug', // 対象とするフィールドを指定。ここではslug
'terms' => 'sea' //タームスラッグを指定
]
];
$query = new WP_Query( $args );
if ( $query->have_posts() ) :
while ( $query->have_posts() ) :
$query->the_post();
//ループの中身
endwhile;
wp_reset_postdata();
endif;
$parent_page = get_page_by_path('parent');
$parent_page_id = $parent_page->ID;
$args = [
'post_type' => 'page',
'post_status' => 'publish',
'posts_per_page' => -1,
'post_parent' => $parent_page_id,
'no_found_rows' => true
];
$query = new WP_Query( $args );
if ( $query->have_posts() ) :
while ( $query->have_posts() ) :
$query->the_post();
//ループの中身
endwhile;
wp_reset_postdata();
endif;
//ページネーションや全記事数の取得が不要な場合
'no_found_rows' => true
//カスタムフィールドを利用しない場合
'update_post_meta_cache' => false
//タクソノミーを利用しない場合
'update_post_term_cache' => false
//IDのみを取得する場合
'fields' => 'ids'
WP_Queryのラッパー関数なのでできることはほぼ同じ。
$args = [
'post_type' => 'post',
'posts_per_page' => -1,
'post_status' => 'publish',
'orderby' => 'date'
];
$query = get_posts( $args );
if ( !empty($query) ) :
foreach ( $query as $q ) :
//ループの中身
endforeach;
wp_reset_postdata();
endif;
WP_Queryとの違いとしては、WP_Queryの方が細かい条件の指定ができたり融通が効くことが多いです。
get_postsは結果だけが返ってくるのに対し、WP_Queryはインスタンスを扱うことになるので若干の差異があります。
個人的な使い分けとしては、管理画面ではget_postsを使います。
カスタムフィールドをSmart Custom Fieldsでコード定義して作る時なんかに、「あの投稿ページの一覧をセレクトボックスにしたいなー」とかっていうようなことがあります。そういう時はget_postsを使います。
理由としては、管理画面でWP_Queryを使うと、他のところに影響してタイトルが置き換わってしまったり、何かとバグることが多いからです。
テンプレートで使うことはあまりないですが、get_postsの方が書き味はいいかもしれません。
pre_get_posts
で各ページのループを制御します。
function custom_query($query)
{
if (is_admin() || ! $query->is_main_query()) {
return;
}
//記事の表示数
$post_per_page = 12;
//投稿者ページ
if ($query->is_author()) {
$query->set('posts_per_page', $post_per_page);
$query->set('orderby', 'date');
$query->set('order', 'DESC');
return;
}
//カテゴリー
if ($query->is_category()) {
$query->set('posts_per_page', $post_per_page);
$query->set('orderby', 'date');
$query->set('order', 'DESC');
return;
}
//タグ
if ($query->is_tag()) {
$query->set('posts_per_page', $post_per_page);
$query->set('orderby', 'date');
$query->set('order', 'DESC');
return;
}
//検索結果
if ($query->is_search()) {
$query->set('post_type', ['post']);
$query->set('posts_per_page', $post_per_page);
$query->set('orderby', 'date');
$query->set('order', 'DESC');
}
//年月アーカイブ
if ($query->is_date()) {
$query->set('posts_per_page', $post_per_page);
$query->set('orderby', 'date');
$query->set('order', 'DESC');
}
//投稿一覧
if ($query->is_archive()) {
$query->set('posts_per_page', $post_per_page);
$query->set('orderby', 'date');
$query->set('order', 'DESC');
return;
}
}
add_action('pre_get_posts', 'custom_query');
ちなみに投稿一覧をarchive.php
で扱う場合はfunctions.php
に以下を追記してパーマリンクを更新するとできます。
//投稿一覧ページの作成
function post_has_archive( $args, $post_type ) {
if ( 'post' == $post_type ) {
$args['rewrite'] = true;
$args['has_archive'] = 'blogs'; // /blogs/が投稿アーカイブページになる
}
return $args;
}
add_filter( 'register_post_type_args', 'post_has_archive', 10, 2 );
blogs
は任意で変更してください。これでテーマ内にarchive.php
を置くと投稿一覧を取得でき、pre_get_posts
で制御できます。
あとはcategory.php
やauthor.php
などのテンプレートを作ってメインループを回すだけです。single.php
も同じですね。
if ( have_posts() ) :
while ( have_posts() ) :
the_post();
//ループの中身
endwhile;
endif;
//カテゴリ全取得
$cat_args = [
'orderby' => 'menu_order',
'hide_empty' => 0
];
$categories = get_categories($cat_args);
if(!empty($categories)){
foreach( $categories as $category ) {
$cat_id = $category->cat_ID;
$cat_link = get_category_link($cat_id);
$cat_name = $category->cat_name;
$cat_slug = $category->slug;
}
}
//タグ一覧
$tags = get_tags([
'orderby' => 'count'
]);
if(!empty($tags)){
foreach($tags as $tag) {
//タグID
$tag_id = $tag->term_id;
//タグページへのリンク
$tag_link = get_tag_link($tag_id);
//タグ名
$tag_name = $tag->name;
}
}
$exclude_users = is_author() ? [$author] : [];
$author_args = [
'orderby' => 'registered',
'exclude' => $exclude_users
];
$author_query = new WP_User_Query( $author_args );
if(!empty($author_query->results)){
foreach ($author_query->results as $author){
//投稿者ID
$author_id = $author->ID;
//投稿者ニックネーム
$author_name = $author->user_nicename;
//投稿者ページリンク
$author_link = get_author_posts_url($author_id);
}
}
とりあえず基本的なものを載せました。これで過去のコード引っ張り出したりいろんなページを見なくても済むかな。多少は。笑
このページはもうちょっと複雑な具体例とかも随時追記していきます!