メモ > 技術 > CMS: WordPress > カスタマイズ(基本)
カスタマイズ(基本)
■コーディング規約
WordPress コーディング規約 - Japanese Team
https://ja.wordpress.org/team/handbook/coding-standards/wordpress-coding-standards/
■一からテーマを作成する
以下などを参考にする。
最低限のものを作るのは難しくないが、汎用的なものを作るのはそれなりに手間がかかる。
WordPressのテーマを自分で作成してみたら意外と簡単だった!|wp.geek
https://wpmake.jp/contents/theme/theme_create/
WordPressのテーマを作る羽目になったWebエンジニアへ
https://zenn.dev/antez/articles/8e576daf822a84
■雛形用のシンプルなテーマ
以下などのテーマを導入して雛形とし、カスタマイズするといい。
テーマが入ったディレクトリを /wp-content/themes 内にアップロードするだけで認識される。
(管理画面から直接インストールするなど、他の方法でのインストールも可。)
SoSimple - Free WordPress Themes
https://wordpress.org/themes/sosimple/
インストールすると、テーマ管理画面に「Good Day, this is the SoSimple theme creator fervillz.」のようなメッセージが表示される。
これは
/wp-content/themes/sosimple/functions.php
の215行目あたりにある、以下の部分をコメントアウトすると非表示にできる。
add_action( 'admin_notices', 'sosimple_admin_notice__success' );
カスタマイズ前に、案件に合わせた名前に変更しておくといい。
/wp-content/themes/sosimple
のディレクトリ名を変更し、
/wp-content/themes/sosimple/style.css
内にあるテーマ情報も変更する。
最低限これだけで大丈夫だが、テーマ内に「@package SoSimple」などが書かれているので、必要に応じて調整する。
以下に自分用に作ったシンプルな汎用テーマがある。
「Simple」というテーマ名は案件用に置換して使うといい。
Ver5でも使用できた。
http://refirio.org/memos/wordpress/themes/simple.zip
なおテーマを作成する際、header.php には wp_head() を、footer.php には wp_footer() を書いておくことを推奨。
WordPressが自動出力する諸々のコードは、この関数の場所に挿入される。
wp_head();とwp_footer();とはいったい何なのか | ゼロイチブログ
https://meshikui.com/2018/08/10/586/
■子テーマ
あるテーマをベースとし、独自に機能を拡張する仕組み。
既存テーマを直接カスタマイズすると、自動更新の際にカスタマイズ内容がリセットされてしまう可能性がある。
子テーマを使えば、親となるテーマが自動更新されても独自の拡張内容が消えない。
子テーマを作ってWordPressの既存テーマをカスタマイズする方法 | Webクリエイターボックス
https://www.webcreatorbox.com/tech/wordpress-child-theme
■一から子テーマを作成する
自作テーマのディレクトリ名が公式テーマのディレクトリ名と偶然重複すると、自作テーマが自動更新の対象にされてしまう。
つまり、突然テーマが上書き削除される可能性がある。
これを防ぐために、使用するテーマは常に子テーマ化しておくという手はある。
(とは言え、子テーマは親テーマの影響を受けるため、自動更新による変更を完全に防げるわけではない。
仕事で一からテーマを作成するなら、既存のテーマと重複しないディレクトリ名を付けるくらいで十分と思われる。
それでも心配なら、自作テーマは自動更新する必要が無いので、テーマの自動更新を無効にしておけばいい。が、デフォルトで無効になっている。)
最低限、親テーマとして以下のファイルを作成し、
/wp-content/themes/sample/index.php
<?php
/wp-content/themes/sample/style.css
/*
Theme Name: Sample
Author: refirio
Author URI: http://refirio.net/
Description: Simple theme for simple websites.
Version: 1.0.0
*/
子テーマとして以下のファイルを作成すれば機能する。
あとは子テーマの内容のみを編集していく。
/wp-content/themes/sample-child/functions.php
<?php
add_action( 'wp_enqueue_scripts', 'theme_enqueue_styles' );
function theme_enqueue_styles() {
wp_enqueue_style( 'parent-style', get_template_directory_uri() . '/style.css' );
wp_enqueue_style( 'child-style', get_stylesheet_directory_uri() . '/style.css', array('parent-style'));
}
/wp-content/themes/sample-child/style.css
/*
Theme Name: Sample Child
Template: sample
Author: refirio
Author URI: http://refirio.net/
Description: Simple theme for simple websites.
Version: 1.0.0
*/
子テーマを作成する際、カレントディレクトリの扱いが変わるので注意。
「get_template_directory」があれば「get_stylesheet_directory」に置換することにより、最低限動作するはず。
WordPress 子テーマがカレントのときのテンプレートディレクトリの取得 - MT Systems
http://web.mt-systems.jp/archives/703
■トップページを作成する
「設定 → 表示設定 → ホームページの表示」
から、特定の固定ページをトップページとして表示できる。
WordPressで固定ページをトップページに指定する方法
https://wp-exp.com/blog/page-top/
もしくは home.php を作ると、トップページ用のファイルとして扱われる。
(その場合 index.php は記事一覧に使われる。)
WordPress Ver3 以降は front-page.php も使用できるようになった。
home.php と同じ用に扱えるが、表示設定の「フロントページ」で何を選択していても影響を受けないという特徴がある。
ざっくりWordPressの自作テンプレートの作り方 - Qiita
https://qiita.com/kazukichi/items/5126a4fd259d374e99ae
テンプレート階層 - WordPress Codex 日本語版
https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E9%9A%8E%E5%B1%A4#.E3....
front-page.phpとhome.phpとindex.phpの関係 | 西沢直木のIT講座
https://www.nishi2002.com/21237.html
WordPressで困惑しがちなindex.phpとhome.phpとfront-page.phpの違い - Kowappa
https://kowappa.com/30
■固定ページに投稿一覧を表示する
固定ページで投稿の一覧表示の実装【初心者のためのWORDPRESS -07-】 | クラウドット株式会社
http://web.archive.org/web/20180624065120/https://www.cloudot.co.jp/blog/2444/
固定ページに投稿記事一覧を表示する【Wordpressテンプレートタグ】 | arutega | アルテガ
https://arutega.jp/wordpress-tips01/
■固定ページごとのテンプレートを用意する
例えば http://example.com/ にWordPressを設置しているとして http://example.com/sample/ というページを作成した場合、
テーマとして page-sample.php を作成するとページ専用テンプレートとして扱われる。
基本的にはこの方法で固定ページを作成していけばいいが、コンテンツはできるだけWordPressのエディタで編集できるようにする方が管理しやすい。
(PHP側にコンテンツを記述すると、更新にFTPが必要になってしまう。
ただしWordPressのエディタ側でコンテンツを記述すると、git管理できないので一長一短。
後者でプログラムを扱いたい場合、ショートコードの結果を埋め込むようにすればいい。)
また、例えば page-contact.php を作成して以下の内容を記述する。
<?php
/*
Template Name: お問合わせページ
*/
?>
そうすると、ページ作成の際に「固定ページの属性」の「テンプレート」からこのファイルを選択できるようになる。
汎用的なページテンプレートを作成する場合、この方法が利用できる。
固定ページのテンプレートを変更する方法【WordPress】
https://webnetamemo.com/coding/wordpress/20150628397
テンプレート階層 - WordPress Codex 日本語版
https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E9%9A%8E%E5%B1%A4#.E5....
以下は固定ページとしてHTML込みで投稿する場合の、汎用的なテーマの例。(page.php)
<?php get_header(); ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php remove_filter( 'the_content', 'wpautop' ); ?>
<?php the_content(); ?>
<?php if ( comments_open() || get_comments_number() ) : ?>
<section class="column">
<div class="inner">
<?php comments_template(); ?>
</div><!-- /.inner -->
</section>
<?php endif ?>
<?php endwhile; ?>
<?php /* get_sidebar(); */ ?>
<?php get_footer(); ?>
■記事ごとのテンプレートを用意する
例えば single-shop-test.php を作成して以下の内容を記述する。
<?php
/*
Template Name: テスト記事
Template Post Type: post,news
*/
?>
そうすると、記事作成の際に「投稿の属性」の「テンプレート」からこのファイルを選択できるようになる。
投稿ページのテンプレートを変更する方法【WordPress】
https://webnetamemo.com/coding/wordpress/201712026347
■自動挿入されるpタグを削除する
このようにして本文を表示している箇所を。
<?php the_content(); ?>
以下のように変更する。(「remove_filter」を追加する。)
<?php remove_filter( 'the_content', 'wpautop' ); ?>
<?php the_content(); ?>
wordpressに自動挿入されるPタグを削除する3つの方法
http://hikarika.jp/ptagusakujo/
■エディタの段落・見出しセレクトボックスの内容を調整する
WordPressのビジュアルエディタの段落・見出しセレクトボックスの内容を変更する方法
https://xov.jp/e/343/
以下のように、「見出し1を選択したら h3 が使われる」のような変更も可能。
function my_tiny_mce_before_init( $ar ) {
$ar['block_formats'] = '段落=p;見出し1=h3;見出し2=h4;見出し3=h5;';
return $ar;
}
add_filter( 'tiny_mce_before_init', 'my_tiny_mce_before_init' );
■ビジュアルエディタを無効にする
HTML込みで固定ページを作成させる場合など、ビジュアルエディタは無効にしておく方が無難。
有効に切り替えて投稿すると、必要なHTMLタグが削除されてしまう可能性がある。
特定の投稿タイプのみ、ビジュアルエディタを無効にすることもできる。
WordPressの記事編集時にビジュアルエディタを使えないようにする方法 | TechMemo
http://techmemo.biz/wordpress/disable-visual-editor/
■リビジョンを有効にする
デフォルト状態で有効になっているはず。
公開ボタン部分に表示されない場合は何度か投稿してみる。(1度だけの投稿だと表示されない。)
「表示オプション」にある「リビジョン」にチェックを入れると、詳細な履歴が表示されるようになる。
■サイトのURLを取得する
以下のようにすれば、サイトのURLを取得できる。
$url = home_url();
以下のようにすれば、最後にスラッシュを付けた状態でサイトのURLを取得できる。
$url = home_url( '/' );
サイトのURLを取得・出力する | The WordPress Press
https://thewppress.com/libraries/get-home-url/
■ショートコード
投稿・固定ページ・テーマで、特定の文字列を書くことで特定の内容を挿入できる。
この仕組をショートコードと呼ぶが、これは自分で追加することができる。
(プログラムは functions.php に閉じ込め、原則としてテーマからはショートコードを呼ぶ…とすると場合によってはメンテナンスしやすいかも。)
WordPressのURLをショートコードにしておく - y.o.designers-works
http://yuji-okayama-designersworks.com/wordpress/871/
functions.php に、一例だが以下の内容を記述する。
/**
* ホームのURLを取得(ショートコード)
*/
function shortcode_home_url() {
return home_url( '/' );
}
add_shortcode( 'home_url', 'shortcode_home_url' );
/**
* テーマのURLを取得(ショートコード)
*/
function shortcode_theme_url() {
return get_template_directory_uri() . '/';
}
add_shortcode( 'theme_url', 'shortcode_theme_url' );
/**
* 投稿一覧を取得(ショートコード)
*/
function shortcode_post_list() {
$paged = get_query_var('paged');
$args = array(
'posts_per_page' => 5,
'paged' => $paged,
'orderby' => 'post_date',
'order' => 'DESC',
'post_type' => 'post',
'post_status' => 'publish'
);
$the_query = new WP_Query($args);
ob_start();
if ( $the_query->have_posts() ) {
while ( $the_query->have_posts() ) {
$the_query->the_post();
?>
<li class="hover">
<a href="<?php the_permalink() ?>" class="hover100">
<div class="img_box">
<?php the_post_thumbnail( 'thumbnail' ); ?>
</div>
<div class="text_box">
<div class="entry_info_box">
<span class="entry-date"><?php the_time( 'Y.m.d' ); ?></span>
<span class="entry-title"><?php the_title(); ?></span>
</div>
<div class="entry_content_box">
<?php echo strip_tags( mb_substr( get_the_content(), 0, 30 ) ); ?>
</div>
</div>
</a></li>
<?php
}
}
wp_reset_postdata();
$contents = ob_get_contents();
ob_end_clean();
return $contents;
}
add_shortcode( 'post_list', 'shortcode_post_list' );
投稿内では、以下のコードで呼び出すことができる。
[home_url] ... ホームのURLを取得。
[theme_url] ... テーマのURLを取得。
[post_list] ... 投稿一覧を取得。
テーマ内では、以下のコードで呼び出すことができる。
<?php echo do_shortcode( '[home_url]' ); ?> ... ホームのURLを取得。
<?php echo do_shortcode( '[theme_url]' ); ?> ... テーマのURLを取得。
<?php echo do_shortcode( '[post_list]' ); ?> ... 投稿一覧を取得。
以下のようにすれば、ショートコードに引数を渡すこともできる。
WordPressのショートコードの引数の使い方 | ホワイトベアー株式会社
https://whitebear-seo.com/wordpress-shortcode-parameter/
■カスタム投稿タイプ
異なるタイプのコンテンツを管理できる。
function.php にコードを追加することで設定できる。以下は追加例。
/**
* カスタム投稿タイプ
*/
function create_post_type() {
// コラム
register_post_type( 'column',
array(
'labels' => array( // ラベル
'name' => 'コラム',
'singular_name' => 'コラム',
'add_new' => '新規追加',
'add_new_item' => '新規コラムを追加',
'edit_item' => 'コラムの編集',
'new_item' => '新規コラムを追加',
'search_items' => 'コラムを検索',
'view_item' => 'コラムを表示',
),
'public' => true, // 投稿タイプをパブリックにするか
'has_archive' => true, // アーカイブを有効にするか
'supports' => array(
'title', // 記事タイトル
'editor', // 記事本文
'comments', // コメント
'thumbnail' // サムネイル
),
'menu_icon' => 'dashicons-edit', // メニューアイコン
'publicly_queryable' => true,
'rewrite' => true,
)
);
add_post_type_support( 'column', 'revisions' ); // リビジョンに対応させる場合
// コラムカテゴリー
register_taxonomy( 'column-cat',
array( 'column' ),
array(
'label' => 'カテゴリー', //表示名
'show_ui' => true, //管理画面に表示するか
'show_admin_column' => true, //管理画面の一覧に表示するか
'show_in_nav_menus' => true, //カスタムメニューの作成画面で表示するか
'hierarchical' => true, //階層構造を持たせるか(持たせるとカテゴリー扱い)
)
);
}
add_action( 'init', 'create_post_type' );
※https://qiita.com/kazukichi/items/5126a4fd259d374e99ae
の内容を参考に、項目やコメントを追加したい。
上のように作成したカスタム投稿タイプの記事を表示する場合、
archive.php
single.php
を複製して
archive-column.php
single-column.php
を作成する。「column」には register_post_type の第一引数で渡したものを指定する。
作成したファイルが認識されない場合、いったん別のテーマに切り替えてから再度戻すと認識されることがある。
カスタム投稿タイプのカテゴリは、タクソノミーを使って作られている。よってカテゴリでの検索結果は
taxonomy.php
を作成する。タクソノミー用のテンプレートを作成して…という流れになる。
taxonomy-xxx.php
のようなファイル名で、タクソノミーごとにテンプレートを作成することもできる。
例えば都道府県として pref というカテゴリを設定した場合、taxonomy-pref.php というファイルを作成すれば都道府県の検索結果ページとして使用される。
ただし、
「コラムとイベント情報の両方に都道府県を設定する」
「コラムを都道府県で検索するページは必要だが、イベントの場合は不要」
という場合、上のページを作成することによってコラムでも都道府県での検索ページが表示されてしまうので注意。
column-pref のような名前で別々にタクソノミーを作るか、taxonomy-pref.php 内でURLを判定して「コラムでなければ404を返す」の処理を入れるなど対応が必要そう。
http://www.example.com/wordpress/
にWordPressを設置した場合、カスタム投稿タイプのURLは以下のようになる。
http://www.example.com/wordpress/column/
http://www.example.com/wordpress/column/%E3%83%86%E3%82%B9%E3%83%88/
Wordpress カスタム投稿タイプの作り方 - Qiita
https://qiita.com/nagasawaaaa/items/9501c0a2e544d85ee78d
WordPressのカスタム投稿タイプでメンバー紹介ページを作成 | Webクリエイターボックス
https://www.webcreatorbox.com/tech/custom-post-type
Function Reference/register post type - WordPress Codex
https://codex.wordpress.org/Function_Reference/register_post_type
タクソノミーテンプレート - WordPress Codex 日本語版
https://wpdocs.osdn.jp/%E3%82%BF%E3%82%AF%E3%82%BD%E3%83%8E%E3%83%9F%E3%83%BC%E3%83%86%E3%83%B3%E3%8...
プラグインを使ってカスタム投稿タイプの設定を行うこともできる。(未検証。)
【Custom Post Type UIの使い方】カスタム投稿作成プラグインCPT UI - WEBST8のブログ
https://webst8.com/blog/wordpress-custom-post-type-ui/
■カスタム投稿タイプのURLを変更
カスタム投稿タイプのURLを変更する場合、Custom Post Type Permalinks プラグインを使うといい。
…らしいが、導入しても何故かURLが変わらなかった?
カテゴリ一覧とタグ一覧ページ以外のURLはおかしなものではないので、導入しなくても大丈夫かも。
カスタム投稿タイプのパーマリンクをカスタム設定できるWordPressプラグイン・Custom Post Type Permalinks | かちびと.net
http://kachibito.net/wordpress/plugin/custom-post-type-permalinks.html
Custom Post Type Permalinksを使ってみる | cly7796.net
http://cly7796.net/wp/cms/try-using-custom-post-type-permalinks/
■カスタム投稿タイプでカテゴリやタグを有効にする
register_taxonomy や register_taxonomy_for_object_type 関数でカテゴリやタグを有効にできる。
一例として「column」というカスタム投稿タイプがある場合、以下のようにする。
// 保険コラムカテゴリー
register_taxonomy( 'column-cat',
array( 'column' ),
array(
'label' => 'カテゴリー', // 表示名
'show_ui' => true, // 管理画面に表示するか
'show_admin_column' => true, // 管理画面の一覧に表示するか
'show_in_nav_menus' => true, // カスタムメニューの作成画面で表示するか
'hierarchical' => true, // 階層構造を持たせるか(持たせるとカテゴリー扱い)
)
);
// 保険コラムタグ
register_taxonomy_for_object_type( 'post_tag', 'column' );
【wordpress】カスタム投稿タイプにカテゴリ&タグ追加しアーカイブページで表示 | クリエイトブック
https://createsbook.com/wordpress/category-tag-archive/
WordPress カスタム投稿タイプ カスタム分類/ Web Design Leaves
https://www.webdesignleaves.com/pr/wp/wp_custom_post_type.html
タグをもとに検索する場合、
get_posts に対して例えば「'tag' => 'テスト'」のように値を渡すと、タグ「テスト」で検索できる。
get_posts に対して例えば「'tag_id' => 191」のようにタグのIDを渡すことでも検索できる。
また pre_get_posts で処理する場合、
「$query->set( 'tag', 'テスト' );」「$query->set( 'tag_id', '191' );」で絞り込みの指定ができる。
【WordPress】特定のタグで絞り込んだ記事の一覧を表示させる方法 - よしあかつき
https://yosiakatsuki.net/blog/get-posts-tag/
カスタム投稿タイプのカテゴリとタグについては、以下の挙動になる。
カテゴリは独立しているが、タグは共通で参照されるようなので注意。
・通常の投稿(post)があり、カスタム投稿タイプとしてコラム(column)を追加したとする。
・投稿(post)に対してカテゴリを登録すると、投稿(post)からのみ選択できるようになる。
・コラム(column)に対してカテゴリを登録すると、コラム(column)からのみ選択できるようになる。
・投稿(post)に対してタグを登録すると、投稿(post)とコラム(column)の両方から選択できるようになる。
・コラム(column)に対してタグを登録すると、投稿(post)とコラム(column)の両方から選択できるようになる。
・タグによる検索結果は別々のものになるが、検索処理の実装内容次第ではある。
■カスタム投稿タイプでリビジョンを有効にする
カスタム投稿タイプは、標準ではリビジョンが無効になっている。
明示的に有効にする必要がある。
カスタム投稿でリビジョンを使えるようにする | Koeda Blog
https://ko-e-da.com/131
■カスタムフィールドの日時で絞り込み表示
【pre_get_posts】カスタムフィールドに入力した日付で今日以降の記事を表示 - Brushape
http://brushape.com/wordpress/%E3%80%90pre_get_posts%E3%80%91%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3...
meta_queryパラメータについて - ハックノート
https://hacknote.jp/archives/46442/
以下は記述例。function.php で pre_get_posts に対して処理する想定。
(イベント終了日が2018年4月30日以降の記事を表示。)
$query->set('meta_query',
array(
array(
'key' => 'event-end',
'value' => '18/04/30',
'compare' => '>=',
'type' => 'DATE'
)
)
);
■記事一覧を取得する(カスタム投稿タイプにも対応)
一例だが、以下のコードで投稿一覧を取得できる。
検索条件の指定は、後述する function.php での pre_get_posts の利用も検討する。(恐らくそちらの方が推奨される方法。)
the_field を使用すれば、カスタムフィールドの情報も取得できる。
<ul>
<?php
$paged = get_query_var('paged');
$args = array(
'posts_per_page' => 5,
'paged' => $paged,
'orderby' => 'post_date',
'order' => 'DESC',
'post_type' => 'post',
'post_status' => 'publish'
);
$the_query = new WP_Query($args);
if ( $the_query->have_posts() ) {
while ( $the_query->have_posts() ) {
$the_query->the_post();
?>
<li><a href="<?php the_permalink() ?>">
<?php the_time( 'Y.m.d' ); ?> ... <?php the_title(); ?>
[<?php the_field( 'icon' ) ?>]
[<?php the_field( 'introduction' ) ?>]
</a></li>
<?php
}
}
wp_reset_postdata();
?>
</ul>
例えば
「'post_type' => 'post',」
の部分を
「'post_type' => 'column',」
とすると、カスタム投稿タイプが「column」の記事を取得できる。
上のコードはごく一般的なものだが、可能なら後述の「記事一覧に表示する内容を制御する」の方法が好ましい。
このコードのように WP_Query で取得する他にも、get_posts で取得する方法もある。
get_posts は WP_Query のラッパー関数。
ただし、
「前者はデータを配列として扱い、後者はオブジェクトとして扱う」
「使えるパラーメーターが異なる」
など差はある。
ここまで違う!WordPressの[WP_Query]と[get_posts()]の特性を暴いてみる | 東京上野のWeb制作会社LIG
https://liginc.co.jp/348970
■記事一覧から検索して取得する(カスタム投稿タイプにも対応)
以下のようにすると、カスタムフィールドの値をもとに検索できる。
$args = array(
'post_type' => 'staff',
'meta_query' => array(
'key' => 'staff_code',
'value' => 'XXX',
'compare' => '=',
)
);
$the_query = new WP_Query( $args );
引き続き詳細な挙動を検証したい。
meta_queryパラメータについて - ハックノート
https://hacknote.jp/archives/46442/
WordPressでカスタムフィールドの値をサイト内検索の対象にする方法(プラグインなし)
https://www.webernote.net/wordpress/custom-fields-search.html
WP_Queryを使って絞り込み検索するのにコレは便利! - シンプルシンプルデザイン WordPress
https://simplesimples.com/web/application/wordpress/wp_query%E3%81%AE%E5%BC%95%E6%95%B0%E3%81%AB%E3%...
未検証だが以下も参考になりそう。
[WordPress] カスタムフィールドで絞り込んで一覧表示する | IT女子のお気に入りフォルダ
https://sachips.byeto.jp/wordpress/wp-customfield-wpquery.html
query_posts(WP_Queryクラス)でカスタムフィールドを使う - WordPress私的マニュアル
https://elearn.jp/wpman/column/c20110915_01.html
■記事の種類を判定する
is_home()、is_single()、is_page()、is_singular('post_type') といった関数を使用することにより、記事の種類で処理を分岐できる。
WordPress 条件分岐一覧 投稿/固定/カテゴリ/カスタム投稿 | なんとなくWEBで食べていく
https://www.nowte.net/wordpress/wordpress-conditional-tag/
■非公開の記事を取得する
記事を取得する際、post_statusを「any」にすることで、公開状態に関わらず記事を取得できる。
ただし下書き状態の記事は、ログインしているユーザに対してのみ表示されるので注意。
'post_status' => 'publish',
↓
'post_status' => 'any',
ログインしていないユーザにも表示したい場合、以下のようにする。
'post_status' => 'publish',
↓
'post_status' => array('any', 'private'),
いっつも忘れるWP_Queryの使用方法とパラメータ一覧。がっつり整理してみた | WEMO
https://wemo.tech/160
これは便利!WordPressのWP_Queryでよく使うコードスニペット | それからデザイン スタッフブログ
https://sole-color-blog.com/blog/265/
WP_Queryの「post_status=any」は「trash」と「auto-draft」を含まないようです。 | Online Inc.
https://www.online-inc.jp/archives/931
■記事一覧に表示する内容を制御する
function.php で pre_get_postsをフックして、一覧に表示する内容を変更できる。
前述の「記事一覧を取得する」よりも推奨される方法とされている。
「ホームなら」「アーカイブページなら」「カスタム投稿タイプが○○なら」
のような条件を指定して制御できる。
【wordpress】pre_get_postsを使ってみませんか? - Qiita
https://qiita.com/_ruka_/items/e14280d34eddf49efad1
wordpressで表示する記事数をしぼる方法 | web関連 | 二色人日記。
https://twotone.me/web/1892/
以下は上記解説ページからのコード例。
function change_posts_per_page($query) {
// 管理画面、メインクエリに干渉しないために必須
if ( is_admin() || ! $query->is_main_query() ){
return;
}
// カテゴリーページの表示件数を5件にする
if ( $query->is_category() ) {
$query->set( 'posts_per_page', '5' );
return;
}
}
add_action( 'pre_get_posts', 'change_posts_per_page' );
またquery_varsをフックしてカスタムクエリを追加することにより、
通常検索対象にならない項目で検索することもできる。
【WordPress】カスタムクエリの追加方法と一緒に追加しておきたい関数やフックなど | Wood-Roots:blog
https://wood-roots.com/web/wordpress/1362
■改ページを自作する
一例だが以下の関数を作成しておき、
function get_pagination($max_pages = '', $paged, $range = 2) {
$showitems = $range + 1;
if (empty($paged)) {
$paged = 1;
}
if (empty($max_pages)) {
$max_pages = 1;
}
$html = '';
if (1 != $max_pages) {
$html .= '<div class="pager">';
for ($i = 1; $i <= $max_pages; $i++) {
if (1 != $max_pages && (!($i >= $paged + $range + 1 || $i <= $paged - $range - 1) || $max_pages <= $showitems)) {
$html .= ($paged == $i) ? '<span>' . $i . '</span>' : '<a href="' . get_pagenum_link($i) . '">' . $i . '</a>';
}
}
$html .= '</div>';
}
return $html;
}
改ページを表示したい箇所で以下のように指定する。
(記事の一覧表示部分は別途作成されているものとする。)
$paged = get_query_var('paged');
$args['posts_per_page'] = -1;
echo get_pagination(ceil(count(get_posts($args)) / $posts_per_page), $paged);
[WordPress]get_postsを使って自作のページネーションを実装する | カバの樹
https://www.kabanoki.net/67/
■カテゴリ一覧を取得する
WordPressの『get_categories』でカテゴリーリストを自由にカスタマイズする | Web技術Tips | ホームページ制作のDOE【横浜】 〜手を抜かず最大のパフォーマンス〜
https://www.doe.co.jp/hp-tips/wordpress/get_categories%E3%81%A7%E3%83%AA%E3%82%B9%E3%83%88%E3%82%92%...
■カスタム投稿タイプのカテゴリ一覧(タクソノミー一覧)を取得する
一例だが以下のようにすると、「column-cat」の一覧を取得できる。
<?php $categories = get_terms( 'column-cat', 'hide_empty=0' ); ?>
<ul>
<?php foreach ($categories as $category) : ?>
<li><a href="<?php echo do_shortcode( '[home_url]' ); ?>/column-cat/<?php echo $category->slug ?>/"><?php echo $category->name ?></a></li>
<?php endforeach; ?>
</ul>
■カスタム投稿タイプのカテゴリ情報(タクソノミー情報)を取得する
一例だが以下のようにすると、カテゴリ名と各種詳細情報を取得できる。
<?php single_term_title(); ?>
<?php
$queried_object = get_queried_object();
// タイトル
$term_title = $queried_object->name;
// ディスクリプション
$term_description = $queried_object->description;
// スラッグ
$term_slug = $queried_object->slug;
// ID
$term_id = $queried_object->term_id;
echo '[' . $term_title . ']';
echo '[' . $term_description . ']';
echo '[' . $term_slug . ']';
echo '[' . $term_id . ']';
?>
WordPress:タームのアーカイブページで、タイトルやスラッグなどの各種情報を取得・表示する方法 | NxWorld
https://www.nxworld.net/wordpress/wp-get-and-display-various-information-on-term-archive-page.html
■カテゴリを複数選択できないようにする
カスタマイズで対応できそうだが要検証。
WordPressのカテゴリー選択を1つに制限する方法 | Bamboo Works(バンブーワークス)
https://bambooworks.co/wordpress-category-select-only-one/
WordPressの投稿でカテゴリーを1つしか選択できないようにする方法 | TechMemo
https://techmemo.biz/wordpress/limit-category-select/
■カテゴリの並び替え
標準機能では並び替えできないので、Category Order and Taxonomy Terms Order プラグインを使う。
カテゴリーの表示順を並び替えるプラグイン - WordPress超初心者講座
https://wp-exp.com/blog/category-order/
Category Order and Taxonomy Terms Order - WordPress プラグイン
https://ja.wordpress.org/plugins/taxonomy-terms-order/
■記事一覧とカテゴリを表示する
$the_query = get_posts( array(
'post_type' => 'post',
'posts_per_page' => -1,
) );
if ( $the_query ) {
foreach ( $the_query as $post ) {
echo '<p>';
echo $post->post_title . '<br>';
$categories = get_the_terms( $post, 'category' );
if ( $categories ) {
foreach ( $categories as $category ) {
if ( $category->parent != 0 ) {
echo $category->name . '<br>';
}
}
}
echo '</p>';
}
}
WordPressで種類が多くて混乱するタクソノミーやタームを表示するときの関数のまとめ | それからデザイン スタッフブログ
https://sole-color-blog.com/blog/488/
■カテゴリを取得できない場合
例えば functions.php に以下を記述して
print('<pre>');
print_r(get_terms('pref', array('get' => 'all')));
print('</pre>');
以下のようなエラーになった場合、
WP_Error Object
(
[errors] => Array
(
[invalid_taxonomy] => Array
(
[0] => 不正なタクソノミー分類です。
)
)
[error_data] => Array
(
)
)
以下で解説されているように、タクソノミーが未定義のタイミングで検索しようとしている可能性がある。
invalid taxonomy など | technopolis
https://technopolis.fun/wordpress/686/
タクソノミーの定義は通常「init」のタイミングで行うので、以下のように「init」内で処理するようにすると解消される可能性がある。
function get_prefs() {
print('<pre>');
print_r(get_terms('pref', array('get' => 'all')));
print('</pre>');
}
add_action( 'init', 'get_prefs' );
それでも実行されない場合、アクションフックの実行順序が影響している可能性がある。
以下で解説されているように、必要に応じて実行順を指定する。
(もしくは、タクソノミーの定義を行っている箇所の直後に処理を記述する。)
できる!WordPressカスタマイズ #04 アクションフックを使ったカスタマイズに挑戦! | 株式会社ベクトル
https://www.vektor-inc.co.jp/post/wordpress-about-action-hook/
■カテゴリで絞り込み表示する
get_posts に category や category_name を渡して絞り込める。
$args = array(
'category' => '',
'category_name' => '',
テンプレートタグ/get posts - WordPress Codex 日本語版
https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/get_...
■カテゴリで絞り込み表示する(カスタム投稿タイプ)
get_posts に tax_query を渡して絞り込める。
カスタム投稿の場合、カテゴリ(category)ではなくタクソノミー(taxonomy)での扱いとなるので注意。
$args = array(
'tax_query' => array(
array(
'taxonomy' => 'genre',
'field' => 'slug',
'terms' => 'jazz'
)
)
);
テンプレートタグ/get posts - WordPress Codex 日本語版
https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/get_...
■特定のカテゴリ除外して表示する(カスタム投稿タイプ)
operator で「NOT IN」を指定すれば、条件を変更できる。
$args = array(
'tax_query' => array(
array(
'taxonomy' => 'genre',
'field' => 'slug',
'terms' => 'jazz'
'operator' => 'NOT IN',
)
)
);
メインループで出力される投稿一覧から、特定のカテゴリー・タグ・タクソノミーに属する記事を除く | The WordPress Press
https://thewppress.com/libraries/exclude-some-posts-that-belong-to-specific-taxonomies/
■特定の記事を除外して表示する
get_posts に exclude を渡して除外できる。
$post_id = get_the_ID();
$args = array(
'exclude' => $post_id,
);
get_postsで現在閲覧中の記事を除外して記事一覧を取得する | AkeCre
https://www.akecre.com/wordpress/exclude_post/
■記事をランダムに表示する
get_posts に orderby で rand を渡すとランダム表示になる。
$post_id = get_the_ID();
$args = array(
'orderby' => 'rand',
);
【WordPress】記事をランダムに表示させる方法!プラグイン不要! | FASTCODING BLOG
https://fastcoding.jp/blog/all/system/wordpress-random/
■日時をフォーマットして表示
the_date() は、同じ日に複数の記事がある場合は一度しか出力されないことに注意。
the_time() だと毎回表示してくれる。
引数としてフォーマットを渡すことができるが、
原則として「the_time( get_option( 'date_format' ) );」という指定にし、WordPressの設定を反映させる方がいいかも。
テンプレートタグ/the date - WordPress Codex 日本語版
https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/the_...
テンプレートタグ/the time - WordPress Codex 日本語版
https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/the_...
WordPressでthe_dateタグは同日だと表示されない | 株式会社LIG
https://liginc.co.jp/designer/archives/2266
■アイキャッチ画像を表示
新着情報にサムネイルを表示したい…のような場合に使える。
WordPressのアイキャッチ画像の設定方法 | Web’Notes
http://webnonotes.com/wordpress/eyecatch/
■WebP形式の画像を扱う
※最新バージョンのWordPressなら、この調整は不要のはず。
functions.php に以下を追加する。
/*
* Webp画像のアップロードを許可
* 以下を参考に対応した
* https://wordpress.vogue.tokyo/wordpress-webp/
*/
function add_file_types_to_uploads( $mimes ) {
$mimes['webp'] = 'image/webp';
return $mimes;
}
add_filter( 'upload_mimes', 'add_file_types_to_uploads' );
/*
* Webp画像のサムネイルを表示
* 以下を参考に対応した(さらに追加で調整した)
* https://ulcoder.com/wp-upload-webp/
*/
function enable_webp_thumbnail ($result, $path) {
if ($result === true) return $result;
if (preg_match('/\.webp$/', $path)) {
$result = true;
}
return $result;
}
add_filter( 'file_is_displayable_image', 'enable_webp_thumbnail', 10, 2 );
以下の記事を参考にしたが、コード内にある「IMAGETYPE_WEBP」はPHP7.1以降で利用できる定数。
より多くの環境で動作するように、上記のコードでは拡張子からの判定に変更している。
WordPressに WebP ファイルをアップロードする方法 - WordPress を簡単に
https://wordpress.vogue.tokyo/wordpress-webp/
WordPressにWebPをアップロードできない・サムネイルが表示されないとき | WEBLOGライナー
https://ulcoder.com/wp-upload-webp/
■入力項目の追加
カスタムフィールドで値を追加できる。
Advanced Custom Fields を使えば、専用画面で項目を管理できる。
Pro版なら、繰り返しフィールドに対応していたりと、より高機能になっている。
初心者必見!WordPressで便利なカスタムフィールドとは?設定する手順とプラグインもまとめて紹介|ferret [フェレット]
https://ferret-plus.com/8047
Advanced Custom Fieldsの使い方ープラグイン | TechAcademyマガジン
https://techacademy.jp/magazine/7640
Advanced Custom Fieldsを更に使いやすく!ACF Proを選ぶ理由と機能紹介 | KERENOR { ケレンオール }
http://www.kerenor.jp/acf-pro-introduction/
無料版Advanced Custom Fieldsから有料版ACF Proへアップグレード/インストールする方法 | KERENOR { ケレンオール }
http://www.kerenor.jp/upgrade-to-acf-pro/
Advanced Custom Fieldsの全フィールドタイプを徹底解説
https://bazubu.com/advanced-custom-fields-36452.html
カスタムフィールドとして追加した値は、テーマ側に以下のようなコードを追加すれば表示できる。
<?php the_field( 'test1' ); ?>
<?php the_field( 'test2' ); ?>
もしくは、以下のようにしても表示できる。
<?php echo get_field( 'test1' ); ?>
<?php echo get_field( 'test2' ); ?>
Advanced Custom Fieldsの出力
http://kotori-blog.com/wordpress/acf_output/
Advanced Custom Fields で追加した項目は、標準ではプレビューの対象にならないので注意。
以下のコードで対応できる。
[WordPress]カスタムフィールドの値もプレビューする - Qiita
https://qiita.com/ki6ool/items/5a13197fbe3c29dc10de
以下だけでも対応できるかも?未検証。
カスタム投稿タイプでAdvanced Custom Fields(ACF)のプレビューが動作しない - ほめぶろ
https://homeblo.net/cptui-acf-preview-not-working/
Custom Field Suiteというものも使われるようになってきているらしい。
Advanced Custom Fieldsの有料版にしか無い機能が無料で使えたりするらしい。
WordPress:Custom Field Suiteの使い方からカスタマイズまで | 新宿のホームページ制作会社 ITTI(イッティ)
https://www.itti.jp/web-design/how-to-display-custom-field-suite/
■フックで処理を制御する
※要検証。
WordPressではフックを使うことにより、特定のタイミングで処理を行わせることができる。
本体やプラグインを改造する前に、アクションフックで対応できないか考える。
WordPressのフック、アクションフック、フィルターフックとは? - WPJ
https://www.webprofessional.jp/wordpress-hook-system/
WordPressにおけるフック処理の仕組みとは?
http://nanoappli.com/blog/archives/7594
プラグイン API/アクションフック一覧 - WordPress Codex 日本語版
https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%82%A2%E3%82%AF%E3%82%B7...
■titleタグについて
現在は wp_title() でtitleタグの内容を出力するのは、非推奨になっているので注意。
(タイトルが二重に出力される可能性がある。)
WordPress 4.4 から wp_title関数が 非推奨になりました - ねんでぶろぐ
https://nendeb.com/313
■パスを「http」始まりではなく「/」はじまりにする
テーマの functions.php に以下を記述する。
class relative_URI {
function relative_URI() {
add_action('get_header', array(&$this, 'get_header'), 1);
add_action('wp_footer', array(&$this, 'wp_footer'), 99999);
}
function replace_relative_URI($content) {
$home_url = trailingslashit(get_home_url('/'));
return str_replace($home_url, '/~wordpress/', $content);
}
function get_header() {
ob_start(array(&$this, 'replace_relative_URI'));
}
function wp_footer() {
ob_end_flush();
}
}
new relative_URI();
【WordPress】出力されるリンクURLを絶対パスからルート相対パスに変更する方法 | WordPress | マイホームブログ | Web屋の芝生DIY
https://web-diy.jp/2016/10/161014_01/
■URLを変更する
add_rewrite_rule() を使えば、アクセスするURLを変更できる。
mod_rewrite を使うまでもなく、大抵のことには対応できそう。
カスタムタクソノミーURLをカスタマイズ!カスタム投稿スラッグを入れる
https://yamatonamiki.com/blog/99/
パーマリンクをfunctions.phpからカスタマイズする(投稿者アーカイブのURLを変更) | H.I. Art Works Web Technorogy
http://tech.hi-works.com/webcreative/793
■管理画面のURLを変更する
ログインページを変える:WordPress私的マニュアル
https://elearn.jp/wpman/column/c20121118_01.html
■管理画面のフッタテキストを変更する
WordPress 管理画面の「WordPress のご利用ありがとうございます。」を削除する方法 - by Takumi Hirashima
https://hirashimatakumi.com/blog/5185.html
■同一LAN内の他端末からアクセスする
スマートフォンから直接手元のPCにアクセスしようとしても、WordPressを http://localhost/wordpress/ のURLでセットアップしていると。
http://192.168.1.25/wordpress/
にアクセスしても
http://localhost/wordpress/
にリダイレクトされてしまう。(他端末からはアクセスできない。)
この場合「http://192.168.1.25」を前提としてWordPressを設置しなおせばアクセスできるが、以下のようにするだけでもアクセスできる。
wp-config.php
define('WP_HOME','http://192.168.1.25/wordpress');
define('WP_SITEURL','http://192.168.1.25/wordpress');
この設定があると、本来のURLよりも優先して認識してくれる。
ただし、マルチサイトで構築したサイトだと正しく反映されないことがあるかも?要調査。
ローカル環境にコピーしたWordPressが本家にリダイレクトされる時の対処法 | TechMemo
http://techmemo.biz/wordpress/redirect-local-xampp/
■WordPress外からWordPressのデータを参照する
普通のPHPファイルで wp-load.php を読み込むと、WordPressの命令を使用できるようになる。
例えば以下のようにすると、WordPressの記事を10件一覧表示できる。
<?php
require_once '/path/to/wp-load.php';
$posts = get_posts('numberposts=10');
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>記事一覧</title>
</head>
<body>
<h1>記事一覧</h1>
<ul>
<?php if ($posts): foreach($posts as $post): setup_postdata($post); ?>
<li><a href="<?php the_permalink();?>"> <?php the_title(); ?></a></li>
<?php endforeach; endif ?>
</ul>
</body>
</html>
例えば以下のようにすると、ヘッダやフッタも含めて表示できる。
<?php
require_once '/path/to/wp-load.php';
$posts = get_posts('numberposts=10');
?>
<?php get_header() ?>
<div id="primary" class="content-area">
<main id="main" class="site-main" role="main">
<h1>記事一覧</h1>
<ul>
<?php if ($posts): foreach($posts as $post): setup_postdata($post); ?>
<li><a href="<?php the_permalink();?>"> <?php the_title(); ?></a></li>
<?php endforeach; endif ?>
</ul>
</main><!-- .site-main -->
</div><!-- .content-area -->
<?php get_sidebar() ?>
<?php get_footer() ?>
■WordPressのユーザーに権限を追加・削除する
WordPressのユーザーに権限を追加・削除する方法
https://labe.jp/blog/webcreation/wordpress/use-authority/
ユーザーの種類と権限 - WordPress Codex 日本語版
https://wpdocs.osdn.jp/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E7%A8%AE%E9%A1%9E%E3%81%A8%E6%A...
例えば以下のようにすると、「購読者」ユーザでも非公開記事にアクセスできるようになる。
いったん add_cap や remove_cap で権限を追加すると、削除するまでその状態が維持されている。
命令を実行すると、その状態がデータベースに記録されているみたい。
function allow_subscriber_read_private_posts() {
$subscriber = get_role( 'subscriber' );
$subscriber->add_cap( 'read_private_posts' );
//$subscriber->remove_cap( 'read_private_posts' );
}
add_action( 'init', 'allow_subscriber_read_private_posts' );
■WordPressでセッションを開始する
デフォルトではセッションが開始されていない。
以下のようなコードで開始する必要がある。
function init_session_start()
{
session_start();
}
add_action('init', 'init_session_start');
【WordPress】SESSIONを扱うのに設定が必要だった...
https://zenn.dev/kibe/articles/d93f54f3ef9cc3
■WordPressからWordPress外のセッションを参照する
WordPressはセッションの保存先をPHPの初期設定に従わず、別の場所に保存するらしい。(要検証。)
一例だが function.php に以下の記述をすることで、他のプログラムとセッションを共有できる。
つまり、他のプログラムでセットしたセッションの内容を、WordPressから参照できる。
function wp_session()
{
session_save_path('C:/xampp/tmp');
session_set_cookie_params(0, '/~wordpress');
session_cache_limiter('none');
session_start();
}
add_action('init', 'wp_session');
うまく反映されなければ、すでに以前のパスでCookieが保存されている可能性がある。
Chromeなら開発者ツールを開いて「Application → Cookies」から、Cookieをクリアする。
ローカル開発環境なら、「http://localhost」を右クリックして「Clear」とし、ページを再読込すればいい。
PHP - WordPressとCakePHPのSESSION変数連携(87598)|teratail
https://teratail.com/questions/87598
■リンク切れのチェック
Broken Link Checker プラグインでチェックを行える。
Broken Link Checker | WordPress.org
https://ja.wordpress.org/plugins/broken-link-checker/
プラグインBroken Link Checker使用方法|間違えるとワードプレス死ぬよ! | ひろしワーク
https://hiroshi.work/linkchecker/
リンク切れをチェックする必要性と、オススメのツール3選をまとめてみた
https://viral-community.com/seo/dead-link-check-3188/
■脆弱性の診断
※未検証。
wpscan環境をWin10 proで手っ取り早く作り、Wordpressサイトの脆弱性をスキャンしてみる - Qiita
https://qiita.com/9steps/items/7860243a86ce6745702c
■特定のページで404エラーを返す
Wordpressで特定ページに来たら404ページを返す - Qiita
https://qiita.com/shim0mura/items/edcc2a953e1da300f983
if (条件) {
global $wp_query;
$wp_query->set_404();
status_header(404);
nocache_headers();
include( get_query_template( '404' ) );
exit;
}
■WordPressの権限
WordPress - 納品時に使える。権限設定をカスタマイズするプラグイン「User Role Editor」 | みずかず
http://mizukazu.minibird.jp/wordpress-%E7%B4%8D%E5%93%81%E6%99%82%E3%81%AB%E4%BD%BF%E3%81%88%E3%82%8...
特権管理者 … マルチサイト管理機能や他のすべての機能へアクセスできるユーザー。
管理者 … シングルサイト内のすべての管理機能にアクセスできるユーザー。
編集者 … 他のユーザーの投稿を含むすべての投稿を発行、管理できるユーザー。
投稿者 … 自身の投稿を発行、管理できるユーザー。
寄稿者 … 自身の投稿を編集、管理できるが、発行はできないユーザー。
購読者 … 閲覧のみできるユーザー。
ユーザ作成時に
「サイトネットワーク管理」の「ユーザー一覧」からユーザを登録編集しようとしても、権限の項目は表示されない。(「特権管理者」の項目はある。)
各子サイトの「ユーザー一覧」からなら、「権限グループ」という項目が表示されて権限を選択できる。
上記のうち「特権管理者」を除く5つの権限から選択できる。
※User Role Editor の有効/無効を切り替えていると、本来表示されるはずの項目が表示されないことがあるかも?
運用開始後に切り替えることは無いと思われるが、念のため要確認。
■User Role Editor
プラグイン User Role Editor を導入すれば、上記権限の内容を確認&編集できる。
また、新しく権限を追加することもできる。
■同時編集の防止
編集ロック機能で先に投稿画面に入ったユーザーを優先させる | WordPressカスタマイズ事典
http://wpcj.net/489
ユーザAとユーザBがいるとして、
ユーザAが記事編集中にユーザBが投稿一覧にアクセスすると、該当記事に
「現在 user-b さんが編集中です」
というメッセージとともにロックアイコンが表示される。
そのままアクセスすると
この投稿は現在編集中です。
user-b さんが現在この投稿を編集中です。
引き継ぎの操作を行わない限り、変更を加えることはできません。
[投稿一覧] [プレビュー(新しいタブで開く)] [引き継ぐ]
というダイアログが表示され、「引き継ぐ」をクリックするとユーザBで記事を編集できるようになる。
編集画面にはユーザAの編集前の状態で表示され、
「以下のバージョンよりも新しい自動保存された投稿があります。」
というリンクから他ユーザの編集内容を確認でき、編集内容を復元することもできる。
ユーザAの画面には
他の人がこの投稿の編集を引き継ぎました。
他のユーザーが現在この投稿のコントロールを編集中ですが、ご心配なく。
これまでに加えた変更は保存されています。
[投稿一覧]
というダイアログが表示され、編集は中断される。
なお、複数のブラウザからユーザAで同時にログインした場合、上の警告は表示されないみたいなので注意。
きちんと管理したければ、1人につき1ユーザを作成しておく。
■同時編集の防止(カスタマイズ)
※キャッシュ問題の可能性はあるが、Gutenbergの兼ね合いもあって挙動が怪しい。
上に記載した「同時編集の防止」のまま使用し、
・同時編集しようとすると警告が表示されます。
・かまわず編集を始めることはできますが、自動保存内容があればページ上部に
「以下のバージョンよりも新しい自動保存された投稿があります。自動保存を表示」
のように表示され、内容を復元できます。
と案内するに留める方が無難かも。
使用しているテーマの function.php に以下を加えると、編集中ダイアログから [引き継ぐ] が削除され、あとから編集できなくなる。
add_filter( 'override_post_lock', '__return_false' );
wp-admin/post.php の180行目あたりに以下の判定があり、「use_block_editor_for_post」の場合に以降の処理がスキップされるため、
「use_block_editor_for_post」でGutenbergを無効にする必要があるかも。
if ( use_block_editor_for_post( $post ) ) {
include( ABSPATH . 'wp-admin/edit-form-blocks.php' );
break;
}
使用しているテーマの function.php に以下を加えると、use_block_editor_for_post の判定が無効になる。
…が、一度編集中ロックになると何故か解除されなくなるみたい?
該当箇所はJavaScriptの処理も絡むようなので、キャッシュよって正しくHTMLが反映されていないだけの可能性はある。
add_filter( 'use_block_editor_for_post', '__return_false' );
編集ロック機能で先に投稿画面に入ったユーザーを優先させる | WordPressカスタマイズ事典
http://wpcj.net/489
2. 8. 1 投稿作成のカスタマイズ(1)入力 サブタイトル入力, テンプレート読み込み, テキストエディタ用フォント等 | WORDPRESS雑感 | 経営・技術コンサルタントのブログ
http://blog.socon.jp/wp/wordpress/wordpress-549/
■承認フロー
ユーザを「寄稿者」として登録すると、記事を新規登録する際に以下のように表示される。
[レビュー待ちとして送信]
レビューをリクエストする準備ができましたか ?
準備ができたらレビューをリクエストしましょう。編集者が承認して公開できます。
管理者が記事の編集画面で「公開する」ボタンを押すと公開される。
公開せずに編集したければ「レビュー待ちとして保存」を押す。
公開された記事は、寄稿者は編集できなくなる。
レビュー待ちの記事が投稿されても管理者に通知されるわけではないが、
若干のカスタマイズもしくはプラグインの導入によって通知できるようになる。
レビュー待ちの投稿がされた時に管理者にメールで通知する | WordPressカスタマイズ事典
http://wpcj.net/1190
■パスワード保護
WordPressの標準機能で可能。
記事を投稿する際に「公開状態」を「パスワード保護」にすると、ユーザ側で記事を表示する際にパスワードが求められる。
いったん認証すると認証状態は10日間続くが、若干のカスタマイズで変更できるみたい。
WordPressのパスワード保護ページをカスタマイズする方法 | ワードプレステーマTCD
https://design-plus1.com/tcd-w/2016/08/password.html
■プログラムから記事を投稿
以下のようにすることで、プログラムから記事を投稿できる。
// お知らせを投稿
$params = array(
'post_author' => 1,
'post_title' => '投稿テスト1',
'post_content' => 'これはwp_insert_postのテストです。',
'post_status' => 'draft',
);
$id = wp_insert_post($params);
echo '$id=[' . $id . ']';
以下のようにすることで、カスタム投稿タイプに記事を投稿できる。
投稿したIDをもとに、カスタムフィールドの内容も渡すことができる。
// お客様の声を投稿
$params = array(
'post_author' => 1,
'post_title' => 'お客様の声 投稿テスト2',
'post_content' => 'これはwp_insert_postのテストです。',
'post_status' => 'draft',
'post_type' => 'voice',
);
$id = wp_insert_post($params);
echo '$id=[' . $id . ']';
if ($id) {
update_post_meta($id, 'cat', '相談した保険のテスト');
update_post_meta($id, 'text', '本文のテスト');
}
WordPressで関数wp_insert_postを使って投稿記事データを一気に流し込む - helog
https://helog.jp/wordpress/wp_insert_post/
■プログラムからコメントを投稿
関数リファレンス/wp insert comment - WordPress Codex 日本語版
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wp_i...
関数リファレンス/get comments - WordPress Codex 日本語版
https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/get_...
get_comments - WordPress私的マニュアル
https://elearn.jp/wpman/function/get_comments.html
■Jetpack
WordPress.com 向けに提供されていたプラグインを、インストール型のWordPressでも使えるようにしたもの。
WordPress公式のプラグインなので安心感はある。
SNS連携、解析機能、サイトマップ作成、セキュリティ対策などなど、WordPressの基本機能を全般的に強化してくれる。
WordPress.com からサイトに接続できない場合、php-xml の追加インストールを試す。
また、SNS連携にも php-xml が必要みたいなので注意。
無ければ連携時に「500 status code for "POST /sites/164563062/publicize-connections/new"」のようなエラーになる。
【2019最新版】Jetpackプラグインの全機能&おすすめの設定方法を解説!
https://adventure-life.jp/how-to-use-jetpack/
すぐに使えて便利!WordPress公式の高機能プラグイン「Jetpack」の設定方法を解説|ferret [フェレット]
https://ferret-plus.com/8173