タグ:WordPress

予約公開ができない場合【WordPress】

WordPressで予約公開ができない場合、原因は色々とあります。

このことは色んなサイトで紹介されています。

でも、たまに公開に失敗するなど原因がよくわからない不具合も起こります。

WordPressの予約投稿は、
一定のアクセスがないと実行されないという仕様になっています。

アクセスがないブログは予約投稿ができないといっても過言ではありません。

WordPressの予約投稿に失敗する原因と見るべき重要ポイントのまとめ! | 自作PCテクニカルセンター

という話まであり、正直Wordpressの予約公開はあまり信用できません。

 

ということで、解決方法として、こんな感じのプログラムをheader.phpの先頭に入れてみました。

if(is_home() || is_front_page()){
	//予約の投稿のみ取得(MAX20件)
	$get_posts = get_posts(array(
		"posts_per_page" => 20,
		"post_type" => "any",
		"post_status" => "future"
	));

	if($get_posts){
		foreach($get_posts as $get_post){
			//現在が予約日時を過ぎている場合
			if($get_post->post_date < current_time("Y-m-d H:i:s")){ 
				//公開処理 
				$save_post = array(
					"ID" => $get_post->ID,
					"post_status" => "publish"
				);
				wp_update_post($save_post);
			}
		}
	}
}

※トップページアクセスの場合のみ反応するようにしています。

post_statusがfutureになっている記事だけ取得し、予約日時が過ぎているものだけ、publishに更新するという簡単なプログラム

ちゃんと動いているし、負荷もそれほどかからないし問題なさそう。(※動作に責任は持ちません)

 

 

総合管理者 | 2017年06月05日 | コメント(0) | トラックバック(0) | CMS関連

WordPressのマルチサイトで参加サイトが表示されない

マルチサイト化されているWordpressのサーバーを移転したところ、参加サイトが表示されなくなってしまいました。

↓この部分

もちろんログインしたアカウントはすべてのサイトに所属しています。

プラグインのせいかと思って全部切ってみたのですが、治らず。

移転時にバージョンアップしたからかとも思いましたが、他のサイトで使っている同じバージョンのWordpressでは、こんな問題は起きたことがありません。

移転中だったのでベーシック認証をかけていたのですが、まさかこれじゃないだろうと思いながらも試しに解除してみたら、表示されるようになりました!

原因はベーシック認証!

こんなことあるのか・・・

ちなみに、一度表示されるようになったら、以降は再びベーシック認証をかけてもちゃんと表示されます。

総合管理者 | 2017年03月08日 | コメント(0) | トラックバック(0) | CMS関連

WordPressのバージョン4.7と4.7.1はヤバイ

ちょっと古い情報ですが、Wordpressのバージョン4.7と4.7.1はかなりヤバイ脆弱性があるそうです。

WordPress の脆弱性対策について:IPA 独立行政法人 情報処理推進機構

WordPress 4.7, 4.7.1 はAPIに致命的なバグがあって認証無しで誰でも記事を改ざんできちゃうっぽい! - かもメモ

上記のサイトに方法が記載されておりますが、簡単に改ざんできてしまうとのこと。

簡単過ぎる!怖い!

4.7から4.7.1へのアップデートは、PHPMailerの件ですぐにアップデートされることは予想しておりましたが、またすぐに4.7.2へのアップデートでしたので、何事?と思っておりましたが、これはかなりやばい脆弱性ですね。

すぐにアップデートするのは考えものですね・・・

ちなみに、Search Consoleでもこのような警告が出てしまう始末

貴サイトが WordPress の古いバージョンである WordPress 4.7.0 or 4.7.1 を実行していることが判明しました。古いバージョンやパッチを適用していないソフトウェアは、ハッキングやマルウェアの攻撃を受けやすくなり、貴サイトの訪問者に被害が及ぶことがあります。そのため、サイト上のソフトウェアをできるだけ早く更新することをおすすめします。

おすすめどころではない、必須事項でしょ。

自分のブログも一瞬だけ4.7.1にしておりましたが、すぐさま4.7.2にアップデートしました。

総合管理者 | 2017年02月14日 | コメント(0) | トラックバック(0) | CMS関連

投稿一覧の各投稿のメニューをカスタマイズする方法

フック!フック!フック!

フックは便利ですね!

ということで、テーマで投稿一覧の各投稿のメニューをカスタマイズする方法のメモです。

下図のように、メニューに「サンプル」を追加する場合

WS002447

テーマのfunctions.phpに以下を追記します。


function custom_post_row_actions($actions, $post) {
//$actions['(キー)'] = '<a href="(リンク先)" title="">(ラベル)</a>';
$actions['sample'] = '<a href="/sample.php" title="">サンプル</a>';
return $actions;
}

add_filter('post_row_actions', 'custom_post_row_actions',10,2);

 

いらないものを消す場合は、unsetします。(以下クイック編集を削除する)


function custom_post_row_actions($actions, $post) {
unset($actions['inline hide-if-no-js']);    //クイック編集
return $actions;
}

add_filter('post_row_actions', 'custom_post_row_actions',10,2);

以下デフォルトのメニューです。

$actions['edit'] 編集
$actions['inline hide-if-no-js'] クイック編集
$actions['trash'] ゴミ箱
$actions['view'] 表示

 

参考サイト

投稿一覧に独自リンクを追加する:WordPress私的マニュアル

総合管理者 | 2016年03月25日 | コメント(0) | トラックバック(0) | CMS関連

WordPressの見落としがちな設定(ゴミ箱)

お客様から、記事が勝手に消えてしまったという連絡を受けました。

話をよく聞いてみると、とりあえず非公開にしたいからゴミ箱に移動させていたとのこと。

いや、そういう時はステータスを「下書き」にするか、公開状態を「非公開」にしてほしいのですが・・・

うっかり「完全に削除する」をクリックしてしまったのではないかと思ったのですが、よくよく調べてみると、Wordpressではゴミ箱に移動した記事は、30日経つと自動的に消えてしまうそうな。

これは知らなかった。

ちなみに、wp-config.phpに

define('EMPTY_TRASH_DAYS', 日数);

と追記することで、保存期間は設定できるらしい。

WordPressでゴミ箱から復元する方法と保存期間を変更する方法 | WordPress奮闘記

とりあえずゴミ箱には、消えても良い記事だけを入れましょう。

総合管理者 | 2015年10月17日 | コメント(0) | トラックバック(0) | CMS関連

bloginfoが非推奨?【WordPress】

今更ながら、bloginfoで一部パラメータの使用が非推奨になっているのに教えてもらって気付きました。

ただ、全部がアウトというわけではなく、Codexを見る限り非推奨になっているパラメータは

  • 'siteurl'
  • 'home'

の2つ。

代わりは

  • echo site_url()
  • echo home_url()

です。(どちらも返り値があるタイプなので出力する場合は要echo)

ちなみに、非推奨になったのは2.2のときみたい(結構前だな)

非推奨とはいえ、一応現在(version4.2.4)でも使用できています。

こういう場合の対策として、基本的に関数はさらにラッピングしといて、functions.phpだけ修正すればOKみたいにしておくべきだろうか・・・

それも面倒だなぁ。

 

参照サイト

総合管理者 | 2015年08月18日 | コメント(0) | トラックバック(0) | CMS関連

投稿件数が0件の時、archive.phpでpost_typeを取得する方法

投稿件数が0件のカスタム投稿ページを開いた場合、archive.phpでは、get_post_type()の返り値がfalseとなり、post_typeが取得できません。

その場合は、

get_query_var('post_type')

で取得できるようになります。

こういうケースは結構あるので、get_post_type()ではなくこっちで取得するようにしたほうが良いですね。

 

参考サイト

総合管理者 | 2015年07月02日 | コメント(0) | トラックバック(0) | CMS関連

wp_list_categories・get_categoriesでデータが取得できない

WordPressであり、Wordpressとは関係ない話。

WordPress管理画面の「カテゴリー」画面で、カテゴリー一覧にまったく表示されない現象になってしまいました。

wp-config.phpでデバッグをtrueにしても、Noticeが並ぶだけで何もエラーは表示されない。

フロントエンドでも、wp_list_categories・get_categoriesが使えない状態に。

これまでの経験でいえば、カテゴリーの並び替え系プラグインが原因で、一度並び替えを行って保存すると直ることが多いのですが、今回はそれでも直らない。

仕方ないので、Wordpress本体の中身を追っていくうち、wp-includes/taxonomy.phpの中にあるfunction get_termsにSQLが書かれていたので、出力して、phpMyAdminで実行したところ、以下のエラーが表示されました。

Got error 28 from storage engine

調べてみたところ、サーバの容量が不足していると起こる現象のようです。

参考元:MySQLで「Got error 28 from storage engine…」と出るときの対処法

Tera Termで「df -h」を実行したところ、確かに100%になってました・・・

クライアントのサーバなので、勝手にファイルを削除するわけにもいかないから、とりあえず削除してよいか問い合わせているところ。

まさかこんなところが原因とは。

プラグインやテーマが原因かと思って、切ったりつけたり編集したり、無駄に時間食った・・・

総合管理者 | 2015年03月15日 | コメント(0) | トラックバック(0) | CMS関連 | DB関連 | サーバー関連

WordPressの検索機能をカスタマイズ

WordPressの検索の欠点として

  • カスタムフィールドが対象外
  • カテゴリー・タグ(タクソノミー)が対象外

というものがあります。

最近は内容フィールドは使用せず、カスタムフィールドに中身を入れるといった場合もあるので、これでは大変不便です。

ということで、検索機能をカスタマイズし、これらからも引っ張ってくるようにします。(ついでに抜粋からも)

なお、検索処理のカスタマイズは「pre_get_posts」をフックした関数にて行います。

pre_get_postsについては、こちらをご覧ください(query_postsを捨てよ、pre_get_postsを使おう【追記あり】【報告あり】)。

functions.phpに下記を追加します。
※pre_get_postsをフックした関数がすでに存在していている場合は、うまく編集してください。

function my_pre_get_posts($query) {
	//管理画面には適応しない
	if ( is_admin() || ! $query->is_main_query() )
		return;
		
	//検索画面の場合
	if($query->is_search()){
		global $wpdb;
		
		$keywords = get_search_query();
		if($keywords){
			
			$keywords = str_replace(" ", " ", $keywords);
			$keyword_array = explode(" ", $keywords);
			$post_ids = array();
			$post_ids_exists = array();
			foreach($keyword_array as $keyword){
				$post_ids_meta = array();	//カスタムフィールド
				$post_ids_post = array();	//タイトル・内容
				$post_ids_term = array();	//カテゴリー
				
				if($keyword){
					$keyword = '%' . like_escape( $keyword ) . '%';
					
					//カスタムフィールド内を検索
					$post_ids_meta = $wpdb->get_col( $wpdb->prepare( "
						SELECT DISTINCT post_id FROM {$wpdb->postmeta}
						WHERE meta_value LIKE '%s'
					", $keyword ) );
					
					//タイトルと内容・抜粋から検索
					$post_ids_post = $wpdb->get_col( $wpdb->prepare( "
						SELECT DISTINCT ID FROM {$wpdb->posts}
						WHERE post_title LIKE '%s'
						OR post_content LIKE '%s'
						OR post_excerpt LIKE '%s'
					", $keyword, $keyword, $keyword ) );
					
					//カテゴリー名から検索
					$term_ids = $wpdb->get_col( $wpdb->prepare( "
						SELECT DISTINCT term_id FROM {$wpdb->terms}
						WHERE name LIKE '%s'
					", $keyword) );
					//ヒットしたカテゴリーが所属する投稿
					if($term_ids){
						$term_id = implode(",", $term_ids);
						$post_ids_term = $wpdb->get_col( $wpdb->prepare( "
							SELECT DISTINCT  object_id FROM {$wpdb->term_relationships}
							WHERE term_taxonomy_id IN (%s) 
						", $term_id) );
					}
					
					//各処理で取得した投稿IDをマージする。
					$post_ids_tmp = array();
					$post_ids_tmp = array_merge($post_ids_meta, $post_ids_post, $post_ids_term);
					
					//重複している投稿IDのみ抜き出す(AND検索のため)
					if($post_ids_tmp){
						//検索ワード1つ目の場合、$post_ids_existsのキーに投稿IDを入れていく(内容はtrue)
						if(empty($post_ids_exists)){
							foreach($post_ids_tmp as $post_id){
								$post_ids_exists[$post_id] = 1;
							}
						}
						//検索ワード2つ目以降の場合
						else{
							//○つ目の投稿IDを$post_ids_exists_tmpキーに入れていく(内容はtrue)
							$post_ids_exists_tmp = array();
							foreach($post_ids_tmp as $post_id){
								$post_ids_exists_tmp[$post_id] = 1;
							}
							
							//1つ目の$post_ids_existsと、○つ目の$post_ids_exists_tmpとを比較し、存在しない場合はunsetする。
							foreach($post_ids_exists as $post_id => $value){
								if($post_ids_exists_tmp[$post_id] != 1){
									unset($post_ids_exists[$post_id]);
								}
							}
						}
					}
				}
			}
			
			//まとめた$post_ids_existsのキー(投稿ID)を、内容に移す
			if($post_ids_exists){
				foreach($post_ids_exists as $post_id => $value){
					$post_ids[] = $post_id;
				}
			}
			if($post_ids){
				$query->set('post__in', $post_ids);
			}else{
				$query->set('post__in', array(0));
			}
			
			
		}else{
			$query->set('post__in', array(0));
		}
		$query->set('s', '');	//本来の検索は邪魔になるので削除しておく
	}
}
add_action( 'pre_get_posts', 'my_pre_get_posts' );

最後に、

$query->set('s', '');

を行っているため、検索結果ページで、$sやget_query_var('s')から検索ワードを取得できなくなっています。

そのため、search.phpのget_header()の前に

$wp_query->query_vars["s"] = $wp_query->query["s"];

を追記してください。
これで$sやget_query_var('s')を使って検索ワードを取得できるようになります。

しかし結構ごつい処理をしてるので重くなりそうな気も・・・大丈夫かな。

参考サイト

nandani | 2014年12月17日 | コメント(2) | トラックバック(0) | CMS関連

Firefoxは勝手にアクセスする

WordPressで、独自にページアクセス数をカウントする機能を作成していたのですが、1ページにアクセスしただけなのに、次のページまで加算されてしまう現象になってしまいました。

どうもwp_head()があると、別のページも加算されてしまう模様。

しかし怪しいところは無い。なぜだ・・・と思っていたら、こんな記事を見つけました。

Firefoxはlink relを先読みする模様

お、おう・・・マジか。

なんてありがた迷惑な機能・・・

とりあえずrel="next"を消す必要があるようなので、こちらのサイト(Firefoxはlink relを先読みする模様)を参考にfunctions.phpに下記を追記しました。

remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');

う~ん。

今回SEO対策を考慮しなくてよいサイトだったのでよかったのですが、rel="next" rel="prev"は本来必要な記述。

SEOを考慮しながら、独自でアクセス数をカウントする機能を追加しなくてはならない場合のことも考えておかねば。

ちなみに、アクセスごとにカウントを取る仕組みは、single.phpに


$pageview_prev = get_post_meta($post->ID, "pageview", "true");
$pageview = $pageview_prev + 1;
update_post_meta($post->ID, 'pageview', $pageview, $pageview_prev);

を追記するだけの簡単なものです。

Google Analyticsとかどうしてるんだろう?

まあ賢いGoogle先生だから何かしらのフィルタリングをしているのだろうけど。

nandani | 2014年12月15日 | コメント(0) | トラックバック(0) | CMS関連

Copyright(c) 2010 - 2017 ダリの雑記