ログイン画面のURLを変更する。

ログイン画面のURLを変更する。

概要
特定ページを経由時にキーを発行しそのキーがない場合は404ページにリダイレクトさせる。

//ログイン画面の制御
//特定のファイル経由のみログイン画面に移行可能に
define( 'LOGIN_PAGE', '○○○○○○○○.php'); //新ログインファイル
add_action( 'login_init', 'admin_login_init');
function admin_login_init(){
	if( !defined('LOGIN_KEY') || password_verify( 'kumakuma', LOGIN_KEY) === false ) {
		header('Location:' . site_url() . '/404.php');
		exit;
	}
}
add_filter( 'site_url', 'admin_login_site_url', 10, 4);
function admin_login_site_url( $url, $path, $orig_scheme, $blog_id){ 
	if( ($path == 'wp-login.php' || preg_match( '/wp-login\.php\?action=\w+/', $path) ) && (is_user_logged_in() || strpos( $_SERVER['REQUEST_URI'], LOGIN_PAGE) !== false) ) {
			$url = str_replace( 'wp-login.php', LOGIN_PAGE, $url);
		}
	return $url;
}
add_filter( 'wp_redirect', 'admin_login_wp_redirect', 10, 2);
function admin_login_wp_redirect( $location, $status) {
	if( is_user_logged_in() && strpos( $_SERVER['REQUEST_URI'], LOGIN_PAGE) !== falsee ) {
		$location = str_replace( 'wp-login.php', LOGIN_PAGE, $location);
	}
	return $location;
}

● ○○○○○○○○.php の中身

<?php
	define('LOGIN_KEY', password_hash( 'kumakuma', PASSWORD_BCRYPT, array('cost'=>10)));
	require_once 'wp-login.php';

kumakumaがキーになる。

とりあえず現状ではwebrootに置かないと上手く機能しない。
たぶん置換しているURLをフルパス対応すればちゃんと別ディレクトリとかでも動くんじゃないかな?
かなかな?

そのうちためそう。

管理画面でAjaxを使う際のぷちまとめ。

function.phpに

//Ajax 設定
function add_my_ajaxurl() {
?>
	<script>
		var ajaxurl = '<?php echo admin_url( 'admin-ajax.php'); ?>';
	</script>
<?php
}
add_action( 'wp_head', 'add_my_ajaxurl', 1 );

//管理画面に既存のjQueryを読み込む
function load_script(){
	wp_enqueue_script('jquery');
}
add_action('init', 'load_script');

//管理画面全体にJSを読み込ませる
function add_my_js() {
	wp_enqueue_script('admin_print_styles',  get_bloginfo('template_url') . '/js/admin.js' , array('jquery'), '', true );
}
add_action('admin_print_scripts', 'add_my_js');

WordPressでAjaxを使う場合は必ずdmin-ajax.phpを通して使わないといけないというルールがあるので
そのファイルを読み込むように設定する

管理画面にwordpressが使っているjQueryを読み込む。
通常つかっている場合もあるけどもjqueryが重複してもどうにかしてくれる関数のようだよ。
んで、Ajaxを記述するためのjsを読み込む。
第5引数をtrueにするとbodyの閉じのあたりに読み込んでくれる。
※wp_footerは必要

読み込むjsはとりあえずこちら。

jQuery(document).ready(function ($) {
$( '#kuma' ).on( 'click', function(){
	$post_type = $("#post_type_select").val();
	$.ajax({
		type: 'POST',
		url: ajaxurl,
		datatype: 'json',
		data: {
			'action' : 'get_custom_taxonomies',
			'post_custom_type' : $post_type,
		},
		success: function( result ){ 
		var $taxonomies = $.parseJSON(result);
			console.log($taxonomies);
			$.each( $taxonomies, function( i, $taxonomy ){
				console.log($taxonomy);
				$("#taxonomy_select").append("<option value='"+ $taxonomy +"'>" + $taxonomy + "</option>");
			});
			$("#taxonomy_select").show();
		 },
	});
	return false;
});
});

‘action’ : ‘get_custom_taxonomies’,
この部分で実行したい関数名を指定

function.phpに戻り実行させたい関数の記述

// Ajaxのアクションの設定
function get_custom_taxonomies(){
	$post_type = $_POST['post_custom_type'];
	$taxonomy_name = array();
	$taxonomies = get_object_taxonomies( $post_type, 'objects' );
	if($taxonomies){
		foreach( $taxonomies as $key => $taxonomy ){
			$taxonomy_name[] = $taxonomy->name;
		}
		$result = json_encode($taxonomy_name);
	}else{
		$result = "";
	}
	echo $result;
	die();
}
add_action( 'wp_ajax_get_custom_taxonomies', 'get_custom_taxonomies' ); //ログインユーザ
add_action( 'wp_ajax_nopriv_view_sitename', 'view_sitename' ); //未ログインユーザ

これが基本的な状態になる。
んで、少しハマったところがそのままjqueryの記述がコンクリフトの関係で$が使えないので
jQuery(document).ready(function ($) {

});
囲みをちょっと変更する必要がある。
これを行うと通常時と同じように$が使えるようになる。

add_action( ‘wp_ajax_view_sitename‘, ‘view_sitename‘ ); //ログインユーザ

add_action( ‘wp_ajax_ //ログインユーザ用
add_action( ‘wp_ajax_nopriv_ //未ログインユーザ用

あとは実行したい関数名を変更したい場合は太字にしているところも変更する必要がある

投稿にカスタムフィールドを作りのデータを保存

// 固定ページスマホ用中身
function nskw_meta_box_inside() {
	$smart_text_value = get_post_meta( $_GET['post'], 'smart_text' );
	$smart_text = $smart_text_value[0];
	?>
		<div><textarea id="smart_text" name="smart_text"><?php if($smart_text) echo $smart_text;?></textarea></div>
	<?php
}

// メタボックスを追加する関数
function nskw_meta_box_output() {
	add_meta_box('nskw_meta_post_page', 'スマートフォンコード', 'nskw_meta_box_inside', 'page', 'normal', 'core' );
}

// フックする
add_action('admin_menu', 'nskw_meta_box_output' );

/*更新ボタンが押されたときに実行*/
add_action('save_post', 'save_custom_field_postdata');

/* 設定したカスタムフィールドの値をDBに書き込む記述 */
function save_custom_field_postdata( $post_id ) {
	$mydata = $_POST['smart_text'];
	if ( "" == get_post_meta( $post_id, 'smart_text' )) {
	/* smart_textというキーでデータが保存されていなかった場合、新しく保存 */
	add_post_meta( $post_id, 'smart_text', $mydata, true ) ;
	} else if ( $mydata != get_post_meta( $post_id, 'smart_text' )) {
	/* smart_textというキーのデータと、現在のデータが不一致の場合、更新 */
	update_post_meta( $post_id, 'smart_text', $mydata ) ;
	} else if ( "" == $mydata ) {
	/* 現在のデータが無い場合、page_layoutというキーの値を削除 */
	delete_post_meta( $post_id, 'smart_text' ) ;
	}
}

メディアを配置する際のフィルター

以前はコアファイルを直接触っていたけど、フィルターくらいあるやろ!と思い探してみたら
ちゃんとあった。
(前回探したときは探し方がよくなかったようだ。
フィルター[image_send_to_editor]
メディアを貼り付けるときの挙動にフィルターをかける。
単純に下のやつは
widthとheightを正規表現と置換を合わせてから文字にしている。

//画像挿入時に自動で決定される横・高の削除
add_filter( 'image_send_to_editor', 'media_size_change' );
function media_size_change( $html ) {
	$html = preg_replace( '/(width|height)="[0-9]+" /', "", $html );
	return $html;
}

管理画面のメニューの文字を置き換える

//管理画面の文字を置き換える
add_filter(  'gettext',  'change_side_text'  );
add_filter(  'ngettext',  'change_side_text'  );
function change_side_text( $translated ) {
     //$translated = str_ireplace(  'ダッシュボード',  '管理画面TOP',  $translated );
     $translated = str_ireplace(  '変更前の文言',  '変更後の文言',  $translated );
     return $translated;
}

これはステキね。

検索にフィルターをかける場合

//検索設定
function custom_search($search, $wp_query) {
	if (!$wp_query->is_search) return;
	$search .= " AND post_type = 'shien'";
	return $search;
}
if(!is_admin()) add_filter('posts_search','custom_search', 10, 2);

!is_admin()などを使ってフィルターをかけるところとかを決めておかないと
管理画面での検索で不具合が起る。

postのページで検索をかけてもなにも検索に引っかからないということになる。

一覧にサムネイルを表示その1

/**投稿一覧にサムネイルを表示 */
if ( !function_exists('fb_AddThumbColumn') && function_exists('add_theme_support') ) {

	// for post and page
	add_theme_support('post-thumbnails', array( 'post', 'page' ) );

	function fb_AddThumbColumn($cols) {

		$cols['thumbnail'] = __('Thumbnail');

		return $cols;
	}

	function fb_AddThumbValue($column_name, $post_id) {

			$width = (int) 35;
			$height = (int) 35;

			if ( 'thumbnail' == $column_name ) {
				// thumbnail of WP 2.9
				$thumbnail_id = get_post_meta( $post_id, '_thumbnail_id', true );
				// image from gallery
				$attachments = get_children( array('post_parent' => $post_id, 'post_type' => 'attachment', 'post_mime_type' => 'image') );
				if ($thumbnail_id)
					$thumb = wp_get_attachment_image( $thumbnail_id, array($width, $height), true );
				elseif ($attachments) {
					foreach ( $attachments as $attachment_id => $attachment ) {
						$thumb = wp_get_attachment_image( $attachment_id, array($width, $height), true );
					}
				}
					if ( isset($thumb) && $thumb ) {
						echo $thumb;
					} else {
						echo __('None');
					}
			}
	}

	// for posts
	add_filter( 'manage_posts_columns', 'fb_AddThumbColumn' );
	add_action( 'manage_posts_custom_column', 'fb_AddThumbValue', 10, 2 );

	// for pages
	add_filter( 'manage_pages_columns', 'fb_AddThumbColumn' );
	add_action( 'manage_pages_custom_column', 'fb_AddThumbValue', 10, 2 );
}