技術めも

WordPress設定

構築

wp-cli

INSTALL

curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
php wp-cli.phar --info

chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp

UPDATE

cd /path/to/wordpress/
wp core version --extra
wp core update
wp core update-db

PLUGIN UPDATE

wp plugin status
wp plugin update nginx-champuru

WP INSTALL

wp core download --locale=ja
wp core config --dbname=wordpress --dbuser=wordpress_user --dbpass=wordpress_pass --dbhost=localhost --locale=ja

コマンドラインから WordPress を操作する wp-cli 初級編

WordPress DB 作成

mysql -u root -p
mysql> CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4;
mysql> GRANT ALL PRIVILEGES ON wordpress.* TO wp_user@localhost IDENTIFIED BY 'wp_pass';

どこからでも接続OK(MYSQL5.7以降)

CREATE USER 'db_user'@'%' IDENTIFIED WITH mysql_native_password BY 'db_pass';
GRANT ALL PRIVILEGES ON db_name.* TO 'db_user'@'%';
FLUSH PRIVILEGES;

バージョン8以降

mysql -u root -p
mysql> CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4;
mysql> CREATE USER 'wp_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'wp_pass';
mysql> GRANT ALL PRIVILEGES ON wordpress.* TO 'wp_user'@'localhost';

運用

DBバックアップ

mysqldump -u mysql_user -p mysql_password --all-databases | gzip > $FILE_NAME

10日以上経過しているバックアップデータを削除

find $BACKUP_PATH -type f -name "mysql_dump_*.sql.gz"  -mtime +9 -daystart | xargs rm -rf

性能&セキュリティ

IP制限

/wp-admin/ に .htaccess 設置

order deny,allow
deny from all
allow from xxx.xxx.xxx.xxx

wp-login.php のあるディレクトリ .htaccess 設置

<Files "wp-login.php">
  order deny,allow
  deny from all
  allow from xxx.xxx.xxx.xxx
</Files>

Admin Cookie

/wp-admin/ に .htaccess 設置

SetEnvIf Cookie cookieName=\x22?★★★★\x22? site_access_allow
Order deny,allow
Deny from all
Allow from env=site_access_allow

wp-login.php のあるディレクトリ .htaccess 設置

<Files wp-login.php>
  SetEnvIf Cookie cookieName=\x22?★★★★\x22? site_access_allow
  Order deny,allow
  Deny from all
  Allow from env=site_access_allow
</Files>

テーマの functions.php

// xmlrpc.phpの無効化
add_filter(‘xmlrpc_enabled’, ‘__return_false’);

// X-Pingback のヘッダー情報消去
function remove_x_pingback($headers) {
    unset($headers['X-Pingback']);
    return $headers;
}
add_filter('wp_headers', 'remove_x_pingback');

// meta のバージョン非表示
remove_action('wp_head','wp_generator');

// css, js リンクのバージョン非表示
function vc_remove_wp_ver_css_js( $src ) {
    if ( strpos( $src, 'ver=')) $src = remove_query_arg('ver', $src );
    return $src;
}
add_filter('style_loader_src', 'vc_remove_wp_ver_css_js', 9999);
add_filter('script_loader_src', 'vc_remove_wp_ver_css_js', 9999);
function show_adsense()
{
    return '<small>スポンサーリンク</small>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- 320x250 テスト -->
<ins class="adsbygoogle"
     style="display:inline-block;width:300px;height:250px"
     data-ad-client="XX-XXX-XXXXXXXXXX"
     data-ad-slot="XXXXXXXX"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>';
}
add_shortcode('adsense', 'show_adsense');

ブログ内容に [adsense] で広告表示

.htaccess

xmlrpc へのアクセス不可

<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>

画像キャッシュ

<Files ~ ".(gif|jpe?g|png|ico)$">
    Header set Cache-Control "max-age=10800, public"
</Files>

wp-config.php

// wp-cron を無効
define('DISABLE_WP_CRON', true);

// プラグインの編集やテーマの編集を無効化
define('DISALLOW_FILE_EDIT' ,true);

// プラグインやテーマのアップグレードを無効化
define('DISALLOW_FILE_MODS', true);

プラグイン

  • TinyMCE Advanced
  • WP Nofollow Post

Open Graph protocol

header.php の上に記載

<!-- OGP -->
<?php if(is_front_page()): ?>
  <meta property="og:title" content="★トップページタイトル★" />
<?php else: ?>
  <meta property="og:title" content="<?php the_title(); ?> | <?php bloginfo('name'); ?>" />
<?php endif; ?>
<meta property="og:locale" content="ja_JP" />
<meta property="og:type" content="blog" />
<meta property="og:url" content="<?php the_permalink(); ?>" />
<?php
if (! is_front_page()){
    if(have_posts()): while(have_posts()): the_post();
         echo '<meta property="og:description" content="'.mb_substr(get_the_excerpt(), 0, 100).'" />'."\n";
    endwhile; endif;
} else {
    echo '<meta property="og:description" content="'; bloginfo('description'); echo '" />'."\n";
}
?>
<meta property="og:site_name" content="<?php bloginfo('name'); ?>" />
<?php
$str = $post->post_content;
$searchPattern = '/<img.*?src=(["\'])(.+?)\1.*?>/i';
if (is_front_page()){
   echo '<meta property="og:image" content="'; bloginfo("template_directory"); echo '/img/top_og_image.jpg" />'."\n";
} else if (has_post_thumbnail() && !is_archive()){
    $image_id = get_post_thumbnail_id();
    $image = wp_get_attachment_image_src( $image_id, 'full');
    echo '<meta property="og:image" content="'.$image[0].'" />';echo "\n";
} else if ( preg_match( $searchPattern, $str, $imgurl ) && !is_archive()) {
    echo '<meta property="og:image" content="'.$imgurl[2].'" />';echo "\n";
} else {
    echo '<meta property="og:image" content="'; bloginfo("template_directory"); echo '/img/default_og_image.jpg" />'."\n";
}
?>
<!-- /OGP -->

SEO

URL

「パーマリンク設定」>「カスタム構造」にチェックを入れて /%postname%

参考

WordPressのxmlrpc.phpとwp-cron.phpを無効化
WordPressのwp-config.phpで出来る事いろいろ