wp-admin/admin-ajax.php 500 (Internal Server Error)って表示されたけどどうしたらよい?

WordPressのAJAXを利用していて「wp-admin/admin-ajax.php 500 (Internal Server Error)」って表示されたときにレスポンスの値が何もないのでどーしようかと思いました。

 

ディスプレイにエラーが表示が出ていないようなのでエラーが表示されるPHPの部分に下記のように1行追加しました。

その後再度アクセスし、エラーを表示させました。

 

 ini_set('display_errors',1);
Fatal error: Uncaught Error: Cannot use object of type WP_Error as array in.......以下省略

 

これだとobject typeがNGなんだとか。。。まあ、あとで中身はチェックです。

WordPressの404判定はどこのフックタイミングでヒットするのか?

WordPressで404の判定がどのタイミングでされているのか調べてみた。

また、その時にクエリを変更して404判定を解除できるのか?

 

※hook名 → is_404()で判定。

 

parse_query → bool(false)

pre_get_posts → bool(false)

the_posts → bool(false)

wp → bool(true)

 

となった。

wpで判定されている。

 

じゃあ、例えば、2つのカスタム投稿をまたいで一覧を表示したい場合はどうするか。。

具体的なイメージは、

あるタクソノミーのときだけ、別のカスタム投稿の記事も合計した一覧を作りたい場合。

 

→これでページネーションをすると、メインのカスタム投稿の記事がないと404の判定になってしまう。

どこでhookをかけたらよいのか….

 

結論として「pre_get_posts」でhookをかける

「$query->set()」でクエリを変更する。archive時の表示件数を変更するのと同じ感じです。

function change_posts_query($query) {
    if ( is_admin() || ! $query->is_main_query() )
        return;


    if ( $query->is_archive() ) { /* アーカイブページの時に表示件数を5件にセット */
        $query->set( 'posts_per_page', 5);
    }
    if ( $query->is_archive() && $query->is_tax()) {
        $query->set( 'post_type', array('custom_post1','custom_post2'));
    }

}
add_action( 'pre_get_posts', 'change_posts_query' );

 

この場合の「get_post_type()」はどっちになるのか

→記事があるのほうのPOSTTYPEが返ってくる。オレオレ的にはメインはこっちのPOSTTYPEだからこっちを返せよ!!っていうのは通じない。

 

「get_query_var( ‘post_type’ )」では2つのPOSTTYPEが返ってきます。

 

っていうことで元の情報を取りながら…

下記のようにすることでURLで指定されたカスタム投稿タイプを取得することが可能

global $wp_query;
var_dump($wp_query->query["post_type"] );

 

 

 

2つをがっちゃん越して表示するのってやっぱりめんどいな。。。

 

 

今更だけどWordPressでホームページ制作するときに忘れがちなことをまとめてみた。

東京で、ホームページをWordPressを使って作成しているけど、関数とかどーするのかとか忘れてしまうからちょとした内容をまとめてみました。

 

get_posts()だと総ページ数が取得できない

それなのでページネーションを使う場合は「new WP_Query()」を利用する

 

固定ページでページネーションしたい

page.phpなどページテンプレートでページネーションを作ることが可能

 

自作したページネーションでarchiveをページ移動したら、404ページが表示される(記事表示件数を変更している場合)

 

function.phpで記事表示件数を変更している場合は、「pre_get_posts」でhookをかけて記事一覧の件数を変更します。

function change_posts_per_page($query) {
    if ( is_admin() || ! $query->is_main_query() )
        return;

    if ( $query->is_archive() ) { /* アーカイブページの時に表示件数を5件にセット */
        $query->set( 'posts_per_page', 5;
    }
}
add_action( 'pre_get_posts', 'change_posts_per_page' );

 

必ず日付を表示したい場合はthe_time()を使う

the_dateでは、「同じ日に複数の記事がある場合は、最初の記事とともに一度だけ出力される。」というこ動作仕様なので、毎回日付を表示したい場合は「the_time( ‘Y-m-d’ ); 」を利用する

 

投稿記事0件では、get_post_type()でPOST TYPEを取得することができない

そんな場合は「get_query_var( ‘post_type’ );」でPOST TYPEを取得する

 

taxonomy.phpで現在のタクソノミー名を取得したい

「get_query_var」を使って取得する。あとは「get_taxonomy( $taxonomy )」でタクソノミーの詳細情報を取得

    $taxonomy  = get_query_var('taxonomy');
    var_dump($taxonomy);

 

taxonomy.phpで現在のターム名を取得したい

「get_query_var」もしくは「single_term_title()」(名前で取得。taxonomy.php)を使って取得する

get_query_var( 'term' )

var_dump(single_term_title())

 

WordPressのクエリで全件取り出したい時は「posts_per_page」を「-1」とする

例:
$arg = array(
    'post_type'=>'page',
    'posts_per_page' => -1,
);
$posts = get_posts($arg);

※用途的には、テーマ設定等で固定ページの全件の一覧を表示して設定を作る場合に利用

 

サムネイルの有無判定を「has_post_thumbnail」で行った場合で、記事にアクセス制限に気を付ける

サムネイル判定に「has_post_thumbnail」を利用しますが、記事自体にアクセス制限がついている場合は、アクセス制限が許可されていないアカウントに対しては、サムネイルが無いよって判断となる。

→非会員でもサムネイルだけ見せたい場合は「has_post_thumbnail」を使えないので「get_the_post_thumbnail」で判定するのが良いかと思う。

 

WordPressはセッションを利用していない

もしワードプレスでセッションを利用したい場合は、PHPのセッション関数で利用することは可能。

 

ホームページ作成に関するちょこっとまとめのページ更新は、随時ついか。

 

.htaccessが勝手に書き換えられる

設定を更新すると勝手に.htaccessが書き換えられることがあります。あれ、設定入れていたのに消えた?ってならないようにするためには「# BEGIN WordPress~# END WordPress」の中に記載しないようにします。

 

特定のページを検索結果から除外したい。プラグインで実施

「Search Exclude」っていうプラグインがあるからそれをインストールして、各ページで設定すればOK

 

カスタム投稿毎の検索結果を作成したい

function.phpに「search-カスタム投稿名」のテンプレートを利用するよという登録が必要。

あとは、「search-カスタム投稿名」テンプレートファイルを作成していく。

 

function.phpに以下を記述

add_filter('template_include','custom_search_template');
function custom_search_template($template){
    if ( is_search() ){
        $post_types = get_query_var('post_type');
        foreach ( (array) $post_types as $post_type )
            $templates[] = "search-{$post_type}.php";
        $templates[] = 'search.php';
        $template = get_query_template('search',$templates);
    }
    return $template;
}

 

検索フォームにhiddenでpost_typew追記する

<form id="search" method="get" action="<?php echo home_url( '/' ); ?>">
  <input type="text" value="<?php the_search_query(); ?>" name="s">
  <input type="hidden" value="post" name="post_type" id="post_type">
  <input type="submit" value="Search">
</form>

ただこれで検索かどうか判定するとアーカイブっぽいので注意

 

URL的には、「/カスタム投稿名?s=」でもいけるみたい。「?s=」が無いとアーカイブが表示される

強制的にtermの内容を変更して保存する方法

WordPressで保存時に強制的にtermの値を追加もしくは変更して保存したかったのでWordPressの関数を調べていたところ「wp_set_object_terms」を発見した。

 

下記のように記述する。例:投稿IDにタームのチェックボックス1とチェックボックス2を強制的にチェックする

wp_set_object_terms(投稿ID, array('チェックボックス1','チェックボックス2'), 'ターム名', true );

 

動作的には上記の一文で、投稿IDのtermに対して変更が行われる。

詳しい関数に関しては下記のURLを参照

https://wpdocs.osdn.jp/関数リファレンス/wp_set_object_terms

 

使ってみたときのざっくりなポイントをまとめてみた。

・この関数だけでtermが保存される。

・termの名前で指定ができる

・4つ目の値で、追加なのか置き換えなのかの設定

・成功するとIDが返ってくる、失敗はエラー内容

 

コツをつかめばなんてことはないかな。

 

contactform7でメール送信内容を強制的に変更する

contactform7でメール送信内容に追加したり、引いたりしたい場合があるかと思います。

今回なそんな場面に遭遇しましたのでhook方法を考えてみました。

 

まずは、「wpcf7_before_send_mail」でhookを掛ける

function.php

add_action("wpcf7_before_send_mail", "wpcf7_do_something");

function wpcf7_do_something($WPCF7_ContactForm)
{

~~~ ここに処理内容 ~~~
 return $wpcf7;
}

 

これでまずはメール送信時のフックが完成!!

 

じゃあ、何をどうしてっていうところで例えばメール本文を置き換える場合は

add_action("wpcf7_before_send_mail", "wpcf7_do_something");

function wpcf7_do_something($WPCF7_ContactForm)
{
    if($WPCF7_ContactForm->id() == コンタクトフォームのID)
    {
        $wpcf7      = WPCF7_ContactForm::get_current();//wpcf7で設定したデータを取得する
        $submission = WPCF7_Submission::get_instance();

        if ($submission) {
            $data = $submission->get_posted_data();//ここでPOSTされたデータを取得する

       //メールの本文を置き換える場合:例
              $mail         = $wpcf7->prop('mail');//メール送信部分を取得
              $mail['body'] ="おきたかえた本文";//本文の置き換えの文章

       ↓で置き換える
              $wpcf7->set_properties(array(
                    "mail" => $mail                
              ));

        }
    return $wpcf7;
     }
}

ってな感じで変更することができる。なので動的に変更しなければならない場合に役立つ。

 

 

contactform7で日付の入力ボックスをどうにかしたい

contactform7で問い合わせフォームを多々作成するのですが、やはり日付の部分が問題になることが多いです。

標準でついているDATEは、HTML5のカレンダー入力を利用するのですが、これですとIE11が非対応になる。

 

contactform7でHTML5のカレンダーが非対応の場合の対処

function.phpに追記

add_filter( 'wpcf7_support_html5_fallback', '__return_true' );

 

 

やっぱりこれだとHTML5のカレンダーを利用するので年数をプルダウンにしてほしいとかもろもろ対応できないです。

っていうことでjQuery UIのカレンダーを利用するのが良いかと思います。

 

WordPressにjQuery UIカレンダーを組み込む方法

function.phpに追記

・wp_enqueue_scriptsでアクション追加

   wp_enqueue_script('jquery-ui-core');
   wp_enqueue_script('jquery-ui-datepicker');

 

 

・filter追加

add_filter( 'wp_head', function() {

    ?>
    <script>
        jQuery( function() {
            jQuery( ".datepicker" ).datepicker({
                changeYear: true,  // 年選択をプルダウン化
                changeMonth: true,  // 月選択をプルダウン化
                showMonthAfterYear: true,//年を月の前にする
                yearRange: '-100:+0',//年の現在の年よりも100年前よりスタートする
            });
        } );
    </script
    <?php
} );

 

ていうことでjQuery UIのカレンダーが「.datepicker」というクラスで呼び出せるようになりました。

あとは、コンタクトフォーム7でテキストボックスで作成し、クラスに「.datepicker」を指定すればOKです。

【WordPress】Ulitmate Memberのユーザー権限グループでグループ名を指定する場合の注意

Ulitmate Memberのユーザー権限グループでグループ名を指定する場合の注意しないといけないことがありました。

 

発動条件としては

権限グループ名:日本語の権限グループ名ABC

 

となっている場合。

具体的には最後の文字が英字で終わる場合

 

作成したロールIDが「um_%e3%82%b9%e….」のようになる。

通常は「custom_role_1」のように英数字で作られる

 

対処としては、最後の文字を英字にしないこと。全角で終わること。

 

もし「um_%e3%82….」のようなロールIDを作ってしまったら、通常の削除では消せない。

 

削除する場合は、

・DB上の「wp_options」の中の「um_role_」から始まって「%xx%xx」となっている行を削除する

・User Role Editorかなにかで、該当の権限を削除する

(格納先がわかりずらいのでこのようにしている)

 

 

【WordPress】コンタクトフォームプラグインで確認機能が標準で装備されているものはどれ?

コンタクトフォームプラグインで確認機能が標準で装備されているものがほしかったので調べた内容をまとめてみました。

 

■contactform 7

標準無し

別プラグインで実装可能だが微妙

→Jqueryとかである程度記述して、POPUPMAKERプラグインで確認をPOPUPで表示したほうがわかりやすいかも。

 

データは残せるのか:別プラグインで残すことが可能

 

■weforms

確認画面ないみたい

slack、salesforceとかに送れるみたい

データの残すのも別のツールに連携

 

■Ninja Forms – The Easy and Powerful Forms Builder

確認画面機能無し

フォーム作るのは簡単。ただ、姓と名を分けて横並びとかは苦労しそう

送信された履歴は残るみたい

 

 

■MW WP Form

確認画面機能あり

フォームの作り方は従来通りとっていいのかな?

エディタ画面でショートコードを埋めていくのでレイアウトも自由かな

データはフォーム毎に残す、残さない設定をする

また、データに残すデータは、メールで送信したデータに限るようだ。

独自のバリデーションも用意できるみたいなので拡張性はあるかな

 

いじょう、ざっくりな内容でした。

 

【WordPress】投稿画面をすっきりとさせる

WordPressの投稿画面をすっきりしたいのと、追加されたフィールドの初期値を設定したい!って思ったのでやってみました。

 

画面をすっきりさせたい

1.投稿画面上部の「表示オプション」の中身を表示する

そうすると下記のように項目が多数ある

 

2.ブラウザの検証を起動して、非表示したい項目の値を取得する

 

3.function.phpに記述する

/**
 * 投稿画面から不要な枠(メタボックス)を無効にします。
 */
function remove_post_meta_boxes() {
    remove_meta_box( 'aiosp', 'post', 'normal' ); 

}
add_action( 'admin_menu', 'remove_post_meta_boxes' );

 

remove_meta_boxの設定ははこちら

これで不要なものの表示がなくなる

 

記述としては下記のように$pageに「post」「page」「カスタム投稿のスラッグ名」を入れればよいらしいがpost以外いかない、、、

remove_meta_box( $id, $page, $context );

 

 

■ultimatemember の Content Restriction の初期値

 

↓で値に対してhookがかけられるようだ

https://docs.ultimatemember.com/article/976-umadminaccesssettingsfields

 

add_filter( 'um_admin_access_settings_fields', 'function_name', 10, 2 );
<?php
add_filter( 'um_admin_access_settings_fields', 'my_admin_access_settings_fields', 10, 2 );
function my_admin_access_settings_fields( $fields, $data ) {
    // your code here
return $fields;
}
?>

 

 

次に初期値。。。

 

 

WordPressを運用する上で気になっているプラグイン

備忘録メモになるのですがWordPressを運用する上で管理を簡略化、不要なものを見せないなどのプラグインで気になったものをメモして残していきます。

 

■Admin Columns

無料:投稿や固定記事を表示を変更するプラグイン

有料:CSVでの出力が可能 → 記事一覧ほしい時につかえるか

Admin Columns

 

 

■Admin Menu Editor

メニューの並び替え類が可能

→利用中

 

Admin Menu Editor

 

忘れてなければ少しずつアップデート予定。