[WordPress] Contact Form 7 に独自ショートコードを追加


<?php
add_action('init', 'my_wpcf7_shortcode');
function my_wpcf7_shortcode(){
wpcf7_add_shortcode('my_shortcode', 'my_wpcf7_shortcode_handler', true);
}
function my_wpcf7_shortcode_handler( $tag ) {
$tag = new WPCF7_Shortcode( $tag );
if ( empty( $tag->name ) )
return '';
$args = array(
'size' => $tag->get_size_option( '40' ),
'maxlength' => $tag->get_maxlength_option(),
'class' => $tag->get_class_option( wpcf7_form_controls_class( $tag->type, $tag->name ) ),
'id' => $tag->get_option( 'id', 'id', true ),
'tabindex' => $tag->get_option( 'tabindex', 'int', true ),
'pre' => $tag->get_option( 'pre', '.*', true ),
'post' => $tag->get_option( 'post', '.*', true ),
);
$defaults = array(
'size' => '40',
'maxlength' => '40',
'class' => $tag->name,
'id' => $tag->name,
'tabindex' => 0,
'pre' => '<span class="wpcf7-form-control-wrap">',
'post' => '</span>',
);
wp_parse_args( $args, $defaults );
$value = '';
if ( wpcf7_is_posted() && isset($_POST[$tag->name]) )
$value = stripslashes_deep( $_POST[$tag->name] );
return sprintf(
$args['pre'] . '<input type="%2$s" name="%1$s" value="%3$s" />' . $args['post'],
$tag->name,
$tag->type,
esc_attr($value)
);
}

バリデーションとかは入れてません

Re: WordPressで更新・お知らせ履歴を別ページで作る方法

WordPressで、更新履歴やお知らせ履歴をリスト表示したシンプルな別ページを作って、トップページやサイドバーからiFrameやphpのinclude等で呼び出したいケースがあります。
方法は色々ありそうです。私がクライアントさんのサイトで行った方法を紹介します。少々強引です。

私が実施した方法は、固定ページ内に更新履歴やお知らせ履歴のループをPHPで書いてしまう方法です。Exec-PHPプラグインを利用すれば、固定ページ内でPHPを実行することができます。

WordPressで更新・お知らせ履歴を別ページで作る方法

色々、最悪です。

まず、顧客案件で Exec-PHP を使うなんてもってのほか。
例えば、お客さんが以下のようなコードを通常記事に打ったら、MySQL のユーザーアカウント/パスワードが漏洩してしまいます。

<?php
echo DB_USER ."\n";
echo DB_PASSWORD."\n";
?>

まぁ、これは極端な例ですが…

Exec-PHP を入れているサイトの投稿者アカウント(管理者権限が無いアカウントでも!)が漏れてしまった場合、攻撃者は好きなだけサーバ上で php コードを実行できるので非常に危険です。
このプラグインを使うのはやめましょう。

あと、メインクエリーの中で query_posts() 使うなとか色々言いたいことはありますが…

この案件の場合はショートコードを用意してやるのが良いです。こんな感じ。


<?php
add_shortcode('recent_posts', 'my_recent_posts');
function my_recent_posts($atts) {
// デフォルトテンプレート
$template = '<div style="border-bottom:dotted 1px #aaaaaa;margin-bottom:20px;font-size:14px">
<div class="title"><a href="%s" target="_top">%s</a></div>
<div class="day" style="font-size:12px;color:#999999">%s</div>
</div>
';
// 引数の処理
extract(shortcode_atts(array(
'template' => $template,
'args' => 'post_type=post&posts_per_page=10',
), $atts));
$the_list = '';
// 最新のポスト取得
$posts = get_posts($args);
foreach ($posts as $post) {
$the_list .= sprintf(
$template,
esc_attr(get_permalink($post->ID)),
esc_html($post->post_title),
mysql2date("Y年m月j日", $post->post_date)
);
}
return $the_list;
}

これで、固定ページ中に [recent_posts] ってショートコードを書いてやれば表示できるようになります。

追記:
もしくは、テーマテンプレート内にウィジェットエリアを用意して「最近の投稿」ウィジェットを使っても良いねって指摘もありました。

そっちの方が簡単かもですね。やりやすいほうで。

追記2:
似たようなことをやるプラグインもあるそうです。

[WordPress] 未使用の meta 情報をテーブルから削除する SQL


delete from wp_postmeta
where not exists (select 'x' from wp_posts where wp_posts.ID = wp_postmeta.post_id);
delete from wp_comments
where not exists (select 'x' from wp_posts where wp_posts.ID = wp_comments.comment_post_id);
delete from wp_commentmeta
where not exists (select 'x' from wp_comments where wp_comments.comment_id = wp_commentmeta.comment_id);
delete from wp_usermeta
where not exists (select 'x' from wp_users where wp_users.ID = wp_usermeta.user_id);
delete from wp_term_taxonomy
where not exists (select 'x' from wp_terms where wp_terms.term_id = wp_term_taxonomy.term_id);
delete from wp_term_relationships
where not exists (select 'x' from wp_term_taxonomy where wp_term_taxonomy.term_taxonomy_id = wp_term_relationships.term_taxonomy_id);

ご利用は計画的に

[WordPress] wp_remote_get() で BASIC 認証ページからデータを取得する


<?php
$user = 'username';
$password = 'password';
$url = 'http://example.com/&#39;;
$args = array(
'headers' => array(
'Authorization' => 'Basic '.base64_encode("$user:$password")
)
);
$result = wp_remote_get($url, $args);

headers に ‘Authorization: Basic ‘ を渡せば良いです。
ユーザー名、パスワードは : (コロン) で区切って base64_encode() してやればおっけ。

WordPress (サブディレクトリ型マルチサイト) の DB を一気に書き換える奴


#!/usr/bin/php
<?php
switch($argc) {
case 1:
case 2:
case 3:
echo "please input new site url and wp directory name, old site url!\n";
exit();
default:
$old_site = isset($argv[3]) ? $argv[3] : '';
$path = $argv[2];
$new_site = $argv[1];
}
$old_domain = $new_domain = false;
$parsed_old_site = parse_url($old_site);
$parsed_new_site = parse_url($new_site);
if ( isset($parsed_old_site['host']) && isset($parsed_new_site['host'])) {
$old_domain = $parsed_old_site['host'];
$new_domain = $parsed_new_site['host'];
$_SERVER['HTTP_HOST'] = $old_domain;
}
if ( !$old_domain || !$new_domain ) {
exit();
}
if ( !file_exists($path.'wp-load.php') && file_exists($path.'wp-config.php') ) {
echo "Not found wp-config.php!\n";
exit();
}
require_once(file_exists($path.'wp-load.php') ? $path.'wp-load.php' : $path.'wp-config.php');
echo "*** main site ***\n";
if ( $new_domain !== $old_domain ) {
global $wpdb;
$wpdb->query("update {$wpdb->prefix}site set domain = '{$new_domain}' where domain = '{$old_domain}'");
$wpdb->query("update {$wpdb->prefix}blogs set domain = '{$new_domain}' where domain = '{$old_domain}'");
}
replace_site_url($new_site, $path, $old_site, true);
$blogs = $wpdb->get_results("select blog_id, domain, path from {$wpdb->prefix}blogs order by blog_id;");
foreach ($blogs as $blog) {
echo "**** {$blog->blog_id} : {$blog->domain}{$blog->path} *****\n";
switch_to_blog($blog->blog_id);
replace_site_url($new_site, $path, $old_site);
}
function replace_site_url($new_site, $path, $old_site, $main = false) {
global $wpdb;
$replace = new ReplaceSiteURL($new_site, $path, $old_site);
// wp_sitemeta
if ($main) {
echo "{$wpdb->prefix}sitemeta : replace '{$replace->old_site}' to '{$replace->new_site}' …\n";
printf("Result: %d\n\n", $replace->sitemeta());
}
// wp_options
echo "{$wpdb->options} : replace '{$replace->old_site}' to '{$replace->new_site}' …\n";
printf("Result: %d\n\n", $replace->options());
// wp_posts
echo "{$wpdb->posts} : replace '{$replace->old_site}' to '{$replace->new_site}' …\n";
printf("Result: %d\n\n", $replace->posts());
// wp_postmeta
echo "{$wpdb->postmeta} : replace '{$replace->old_site}' to '{$replace->new_site}' …\n";
printf("Result: %d\n\n", $replace->postmeta());
// wp_usermeta
echo "{$wpdb->usermeta} : replace '{$replace->old_site}' to '{$replace->new_site}' …\n";
printf("Result: %d\n\n", $replace->usermeta());
// wp_commentmeta
echo "{$wpdb->commentmeta} : replace '{$replace->old_site}' to '{$replace->new_site}' …\n";
printf("Result: %d\n\n", $replace->commentmeta());
unset($replace);
}
// replace class
class ReplaceSiteURL {
public $new_site;
public $old_site;
public $wp_path;
function __construct($new_site, $path, $old_site = '') {
$this->new_site = untrailingslashit(preg_match('/^https?:\/\//i', $new_site) ? $new_site : 'http://&#39;.$new_site );
$old_site = (!empty($old_site) && !preg_match('/^https?:\/\//i', $old_site) ? 'http://&#39;.$old_site : $old_site );
$this->old_site = untrailingslashit(empty($old_site) ? home_url() : $old_site);
$this->wp_path = $path;
}
// wp_options
public function options() {
global $wpdb;
$count = 0;
$sql = $wpdb->prepare(
"SELECT * from `{$wpdb->options}` where option_value like %s",
'%'.untrailingslashit($this->old_site).'%'
);
$results = $wpdb->get_results($sql);
foreach ($results as $result){
$sql = $wpdb->prepare(
"UPDATE `{$wpdb->options}` SET option_value = %s where option_id = %d",
$this->replace($this->old_site, $this->new_site, $result->option_value) ,
$result->option_id
);
$wpdb->query($sql);
$count++;
}
return $count;
}
// wp_posts
public function posts() {
global $wpdb;
$sql = $wpdb->prepare(
"UPDATE `{$wpdb->posts}` SET post_content=REPLACE(post_content, %s, %s) where post_content like %s",
$this->old_site,
$this->new_site,
"%{$this->old_site}%"
);
return $wpdb->query($sql);
}
// wp_postmeta
public function postmeta() {
global $wpdb;
$count = 0;
$sql = $wpdb->prepare(
"SELECT * from `{$wpdb->postmeta}` where meta_value like %s",
'%'.untrailingslashit($this->old_site).'%'
);
$results = $wpdb->get_results($sql);
foreach ($results as $result){
$sql = $wpdb->prepare(
"UPDATE `{$wpdb->postmeta}` SET meta_value = %s where meta_id = %d",
$this->replace($this->old_site, $this->new_site, $result->meta_value) ,
$result->meta_id
);
$wpdb->query($sql);
$count++;
}
return $count;
}
// wp_usermeta
public function usermeta() {
global $wpdb;
$count = 0;
$sql = $wpdb->prepare(
"SELECT * from `{$wpdb->usermeta}` where meta_value like %s",
'%'.untrailingslashit($this->old_site).'%'
);
$results = $wpdb->get_results($sql);
foreach ($results as $result){
$sql = $wpdb->prepare(
"UPDATE `{$wpdb->usermeta}` SET meta_value = %s where umeta_id = %d",
$this->replace($this->old_site, $this->new_site, $result->meta_value) ,
$result->umeta_id
);
$wpdb->query($sql);
$count++;
}
return $count;
}
// wp_commentmeta
public function commentmeta() {
global $wpdb;
$count = 0;
$sql = $wpdb->prepare(
"SELECT * from `{$wpdb->commentmeta}` where meta_value like %s",
'%'.untrailingslashit($this->old_site).'%'
);
$results = $wpdb->get_results($sql);
foreach ($results as $result){
$sql = $wpdb->prepare(
"UPDATE `{$wpdb->commentmeta}` SET meta_value = %s where meta_id = %d",
$this->replace($this->old_site, $this->new_site, $result->meta_value) ,
$result->meta_id
);
$wpdb->query($sql);
$count++;
}
return $count;
}
// wp_sitemeta
public function sitemeta() {
global $wpdb;
$count = 0;
$sql = $wpdb->prepare(
"SELECT * from `{$wpdb->prefix}sitemeta` where meta_value like %s",
'%'.untrailingslashit($this->old_site).'%'
);
$results = $wpdb->get_results($sql);
foreach ($results as $result){
$sql = $wpdb->prepare(
"UPDATE `{$wpdb->prefix}sitemeta` SET meta_value = %s where meta_id = %d",
$this->replace($this->old_site, $this->new_site, $result->meta_value) ,
$result->meta_id
);
$wpdb->query($sql);
$count++;
}
return $count;
}
private function replace($origin, $replaced, $value) {
if ( is_serialized($value) ) {
$value = maybe_unserialize($value);
$value = $this->deep_replace($origin, $replaced, $value);
$value = maybe_serialize($value);
} else {
$value = str_replace($origin, $replaced, $value);
}
return $value;
}
private function deep_replace($origin, $replaced, $datas) {
if ( is_array($datas) || is_object($datas) ) {
foreach ( $datas as &$data ) {
if ( is_array($data) || is_object($data) ) {
$data = $this->deep_replace($origin, $replaced, $data);
} else {
$data = str_replace($origin, $replaced, $data);
}
}
}
return $datas;
}
}

[WordPress] 固定ページによってテーマを切り替える

標題の通り、
特定のURL、固定ページのみ「theme」を切り替える
にはどのようにしたら良いでしょうか。

現在、Multi Device Switcherでユーザーエージェントを見て、
themeを分けているのですが、

ある固定ページ(URL)のみ、
themeを切り替えたくないのです。

何か良いアイデアがありましたら教えて下さい!!

via. 特定のURL、固定ページのみ「theme」を切り替える


<?php
/*
Plugin Name: Hardcode theme switcher
Plugin URI: http://ja.forums.wordpress.org/topic/13483
Author: Takuro Hishikawa
Version: 0.1
*/
function my_theme_switcher($theme){
// yes, it's hardcoded!
switch (preg_replace('#^/([^/]+)/?.*$#', '$1', $_SERVER['REQUEST_URI'])) {
case 'about':
$overrideTheme = 'twentyten';
break;
case 'news':
$overrideTheme = 'twentyeleven';
break;
case 'blog':
$overrideTheme = 'twentytwelve';
break;
default:
$overrideTheme = false;
}
if ( $overrideTheme ) {
$overrideTheme = wp_get_theme($overrideTheme);
return $overrideTheme->exists()
? $overrideTheme['Template']
: $theme;
}
return $theme;
}
add_filter('stylesheet', 'my_theme_switcher', 50);
add_filter('template', 'my_theme_switcher', 50);