[WordPress] WP ユーザー認証を BASIC 認証に利用する


<?php
function basic_auth(){
nocache_headers();
if ( is_user_logged_in() )
return;
// WordPress のユーザー認証で BASIC 認証ユーザー/パスワードをチェック
$user = isset($_SERVER["PHP_AUTH_USER"]) ? $_SERVER["PHP_AUTH_USER"] : '';
$pwd = isset($_SERVER["PHP_AUTH_PW"]) ? $_SERVER["PHP_AUTH_PW"] : '';
if ( !is_wp_error(wp_authenticate($user, $pwd)) ) {
return;
}
// BASIC 認証が必要
header('WWW-Authenticate: Basic realm="Please Enter Your Password"');
header('HTTP/1.0 401 Unauthorized');
echo 'Authorization Required';
die();
}
add_action('template_redirect','basic_auth');

ただし、Nginx のリバースプロキシキャッシュとか WP Super Cache が有効になってる場合は、正常に動作しないので注意

追記:
最初に nocache_headers(); を追加したので、Nginx のリバースプロキシキャッシュにキャッシングされなくなりました。
WP Super Cache については知らん

[WordPress] すべての投稿を一括でゴミ箱に入れたい


<?php
/***
* Trash all post
**/
add_action('wp_loaded','my_trash_all_posts');
function my_trash_all_posts() {
if ( !current_user_can( 'edit_others_posts' ) )
return;
$nonce = isset($_POST['nonce']) ? $_POST['nonce'] : '';
if ( isset($_POST['trash_all']) && wp_verify_nonce($nonce, 'trash_all_posts') ) {
global $wpdb;
$post_type = isset($_POST['post_type']) ? $_POST['post_type'] : 'post';
$result = $wpdb->query($wpdb->prepare("
update {$wpdb->posts}
set post_status = 'trash'
where post_type = %s and post_status != 'trash'",
$post_type
));
$json = json_encode(array(
'result' => $result,
));
nocache_headers();
header( 'Content-Type: application/json; charset=' . get_bloginfo('charset') );
echo $json;
die();
}
}
add_action('restrict_manage_posts', 'my_restrict_manage_posts_trash_all');
function my_restrict_manage_posts_trash_all() {
if ( !current_user_can( 'edit_others_posts' ) )
return;
$post_type = isset($_REQUEST['post_type']) ? $_REQUEST['post_type'] : 'post';
$post_status = isset($_REQUEST['post_status']) ? $_REQUEST['post_status'] : '';
if ( $post_status !== 'trash' ) {
?>
<script type="text/javascript">
jQuery(function($){
var $trash_all = $('<?php submit_button( '全ての投稿をゴミ箱に入れる', 'button-secondary apply', 'trash_all', false ); ?>');
$('#post-query-submit').after($trash_all);
$trash_all.click(function(){
$.ajax({
url: '<?php echo admin_url("edit.php?post_type={$post_type}");?>',
type: 'POST',
data: {
trash_all: true,
post_type: '<?php echo $post_type; ?>',
nonce: '<?php echo wp_create_nonce('trash_all_posts'); ?>',
},
success: function(){
location.href = '<?php echo admin_url("edit.php?post_status=trash&post_type={$post_type}");?>';
},
})
return false;
});
});
</script>
<?php
}
}

別名:自爆ボタン
本番運用前にテストデータを全部消し去りたい時とかに使おう。

[WordPress] 投稿一覧にエクスポートリンクを追加する


<?php
add_filter('views_edit-post', 'add_export_link');
function add_export_link( $views ){
$views[] = sprintf(
'<a href="%s">%s</a>',
esc_attr(site_url('/wp-admin/export.php?download=true&content=posts')),
__('Export')
);
return $views;
}

こんな感じ
add export link

post では無く、カスタム投稿ポスト “example” に追加したい場合はフィルター名を "views_edit-example" に変更

[WordPress] 添付画像表示ページのタイトルを親投稿のタイトルに合わせる


<?php
function my_attachment_title($title, $id) {
if ( is_admin() )
return $title;
$post = is_object($id)
? $id
: $post = get_post($id);
if ( !$post || $post->post_type !== 'attachment' )
return $title;
if ( $post_parent = get_post($post->post_parent) ) {
$title = intval($post->menu_order) > 0
? $post_parent->post_title . ' (' . intval($post->menu_order) . ')'
: $post_parent->post_title;
$title = apply_filters('the_title', $title, $post_parent->ID);
}
unset($post);
unset($post_parent);
return $title;
}
add_filter('the_title', 'my_attachment_title', 10, 2);
add_filter('single_post_title', 'my_attachment_title', 10, 2);

[WordPress] 画像のURLを入れるだけで表示してくれちゃうスニペット


<?php
function wp_embed_handler_image( $matches, $attr, $url, $rawattr ) {
$embed = sprintf(
'<img src="%1$s" alt="" />',
esc_attr($matches[0])
);
return apply_filters( 'embed_image', $embed, $matches, $attr, $url, $rawattr );
}
wp_embed_register_handler( 'image', '/^https?(:\/\/[-_\.!~*\'()a-zA-Z0-9;\/:\@=+\$,%#]+)(\.jpe?g|\.gif|\.png)$/', 'wp_embed_handler_image', 10, 4 );

スケルトンだから、色々機能を追加してください。あと、WordPress で oEmbed 有効にしておいてね

[WordPress] 管理画面の投稿一覧にカスタムフィールドの値での絞り込み検索を追加する

カスタムフィールド “my_meta_key” の値での絞り込み検索機能を、管理画面の投稿一覧に追加する方法。


<?php
add_filter('query_vars', function($vars){
array_push($vars, 'my_meta_key');
return $vars;
});
add_action('restrict_manage_posts', function(){
printf(
'<input type="text" id="%1$s" name="%1$s" value="%2$s" />',
'my_meta_key',
esc_attr(get_query_var('my_meta_key'))
);
});
add_filter('posts_where', function( $where ) {
global $wpdb;
if ( !is_admin() )
return $where;
$value = get_query_var('my_meta_key');
if ( !empty($value) ) {
$where .= $wpdb->prepare("
AND EXISTS (
SELECT 'x'
FROM {$wpdb->postmeta} as m
WHERE m.post_id = {$wpdb->posts}.ID
AND m.meta_key = 'my_meta_key'
AND m.meta_value like %s
)",
"%{$value}%"
);
}
return $where;
});

Re: WordPressで提供する Web API #wacja2012

Web APIであるからには、JavaScriprからも利用可能なJSON形式にも対応したい。PHPのjson_encode()という関数で変換して出力する。

via. WordPressで提供する Web API #wacja2012

僕の作ったプラグインで実装できるよ。
WordPress › Feed JSON « WordPress Plugins

こんな感じ

情報を増やしたり、フォーマットを変えたい時はプラグインに含まれている feed-json-template.php ってファイルをテーマディレクトリ内に feed-json.php って名前でコピーして色々修正してね。