wordpress」カテゴリーアーカイブ

WordPressサイトがforbiddenになる

WordPressのサイトがforbiddenになるときは、wp-config.phpや.htaccessなどのパーミッションを確認しましょう。
それでもダメな場合、利用しているレンタルサーバー独自に必要な記述が.htaccessに入っていない場合があるので、それも探してみましょう。

なんか投稿がうまく出ないときの最強記述

ショートコードとかで外部PHPから投稿一覧出力の記述を読み込んだ時に、何故かその出力させたページのタイトルがお知らせ一覧に出る!なんで!?!?
ということで、恐らくその外部PHPを包んでるPHPとの兼ね合いとかだと思うんですけど、まあなんというかこれで上手くいったので貼っておきます。
なんでかな~・・?

<?php
$args = array(
'post_type' => 'post',
'posts_per_page' => 10
);
$st_query = new WP_Query( $args );
?>
<?php if ( $st_query->have_posts() ): ?>
<?php while ( $st_query->have_posts() ) : $st_query->the_post(); ?>
<?php the_time( 'Y年m月d日' ); ?><br />
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a><br />
<?php endwhile; ?>
<?php else: ?>
<p>新しい記事はありません</p>
<?php endif; ?>

固定ページにページャー作成する

これはホントに保存版。
固定ページに投稿一覧を出力してページャー作成したいときって、なんでいつもこんなに時間がかかるんだろう・・
ってくらいうまく行かない!!!ということで我ながらカスタマイズして動いたものをどうぞ。

これを固定ページにインクルードして読み込む。

備忘録なので、「posts_per_page」とか「cat」とか、出力されるループ処理とかは適宜変えるとよろしい。

<?php
$paged = (int) get_query_var('paged');

$args = array(
'posts_per_page' => 10,
'cat' => 3,
'orderby' => 'post_date',
'order' => 'DESC',
'post_type' => 'post',
'post_status' => 'publish'
);
$the_query = new WP_Query($args);

if ($the_query->have_posts()) : while ($the_query->have_posts()) : $the_query->the_post();
?>
<dl>
<dt><i class="far fa-calendar-alt"></i><?php echo get_the_date('Y年m月d日'); ?></dt>
<dd>
<a href="<?php the_permalink() ?>"><?php the_title(); ?></a>
</dd>
</dl>

<?php endwhile; else: ?>
<p><?php echo "お探しの記事、ページは見つかりませんでした。"; ?></p>
<?php endif; ?>

<?php
if ($the_query->max_num_pages > 1) {
echo paginate_links(array(
'base' => get_pagenum_link(1) . '%_%',
'format' => 'page/%#%/',
'current' => max(1, $paged),
'total' => $the_query->max_num_pages
));
}
wp_reset_postdata();
?>

マルチサイトWordPressの子サイト別basic認証をつける

管理画面だけにbasic認証をつけたい時はこちら

ベーシック認証をかけたいマルチサイトのURLが例えば、「http://exemple/hoge/」というURLだとしたら、WordPressが設置してあるFTPのルートディレクトリに「hoge」というディレクトリを作成します。

次に、作成したディレクトリの中に「index.php」を設置します。このindex.phpは、ルートディレクトリのindex.phpをコピーしたものになります。

ここで注意したいのが、「wp-blog-header.php」までのパスになります。ルートディレクトリから1階層下の場所にあるので「../ 」をつけなければなりません。

FTPに.htaccessと.htpasswdをアップする

このように3つのファイルが作成したディレクトリに設置されていればOKです。

具体的に
.htaccess

<Files ~ "^\.(htaccess|htpasswd)$">
deny from all
</Files>
Options -Indexes
AuthUserFile /home/****/****/hoge/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user
order deny,allow

index.php

<?php
/**
* Front to the WordPress application. This file doesn't do anything, but loads
* wp-blog-header.php which does and tells WordPress to load the theme.
*
* @package WordPress
*/

/**
* Tells WordPress to load the WordPress theme and output it.
*
* @var bool
*/
define('WP_USE_THEMES', true);

/** Loads the WordPress Environment and Template */
require( dirname( __FILE__ ) . '/../wp-blog-header.php' );

ユーザ新規追加の時に役割が出ない!

マルチサイト化されたサイトにありがちらしい、ユーザ追加画面で役割のプルダウンが出ないってやつ。
これかなり苦戦しました。

こういう状況。(英語版だけど)

これを直すにはphpMyAdminをいじる必要がある。

該当するサイトのoptionsテーブルの「option_name」のカラムに「wp_user_roles」という値があります。
これを「wp_X_user_roles」に変える。

たとえば、「wp_6_options」とか、所謂ID=6のサイトだった場合、「wp_6_user_roles」に変えてあげる、

これで出るようになる。

海外のフォーラムか何かで見つけたんだけど、ホント結局は頼りになるのは世界70億人のみんなでした。

Recent Posts ExtendedとVK Link Target Controllerを併せて使うとき

Recent Posts Extendedはウィジェット上でカテゴリーを指定して投稿を出力出来る便利プラグインです。

VK Link Target Controllerで投稿のリンクを押下したときに別ページ&別タブにするのは、ここでやりました。

ですが、この対処法はRecent Posts Extendedで出力された投稿には効かないのです・・・

ということで、以下。

いじるファイルはこれ。

../wp-content/plugins/recent-posts-widget-extended/includes/functions.php

その中に、以下のような記述があるところがあります。

$html .= '<h3 class="rpwe-title" id="post-'.get_the_ID().'"><a href="' . esc_url( get_permalink() ) . '" title="' . sprintf( esc_attr__( 'Permalink to %s', 'recent-posts-widget-extended' ), the_title_attribute( 'echo=0' ) ) . '" rel="bookmark">' . esc_attr( get_the_title() ) . '</a></h3>';

h3 class=”rpwe-title”とかで検索引っ掛けるとすぐ見つかります。多分一箇所しかないので。

それで、この↓部分を

<h3 class="rpwe-title">

こうする。

<h3 class="rpwe-title" id="post-'.get_the_ID().'">

これで大丈夫だと思います。

<?php the_ID(); ?>

だと、上手く取得できないので、上みたいに書いてください。
何でかはあとで調べておきます。

余談:
本当に何でもかんでも別タブにしたいときはこうする。

$html .= '<h3 class="rpwe-title"><a href="' . esc_url( get_permalink() ) . '" title="' . sprintf( esc_attr__( 'Permalink to %s', 'recent-posts-widget-extended' ), the_title_attribute( 'echo=0' ) ) . '" target="_blank" rel="bookmark">' . esc_attr( get_the_title() ) . '</a></h3>';

VK Link Target Controllerのリンクを別タブで出す

VK Link Target Controllerという、個別の投稿のリンクを押下すると投稿詳細ではなく別のページにジャンプ出来るプラグインがあります。

それがどうやら、普通のテーマだと別タブで開かないらしいです。外部リンクにしたいとき面倒。
公式テーマ(Twentyシリーズ)とかはいけるっぽいけど・・

ということで以下の対処。

<?php while (have_posts()): the_post(); ?>
<div class="entry">
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<span><?php the_excerpt(); ?></span>
</div>
<?php endwhile; ?>

こういう場合、リンクの親要素に以下のid属性を付与。

<div class="entry" id="post-<?php the_ID(); ?>">

おわり。

カテゴリーを一つだけ取得する

使い勝手としては以下。

個別記事をページングしたい。記事のカテゴリは一つだけど、レパートリとして複数カテゴリある。
今のところ単一カテゴリを絞ったページングは可能だけど、複数カテゴリを跨いではしんどい。

結局ページング用カテゴリをページングさせたい記事に設定するしかない・・・

要はこういうこと。
カテゴリー1、2、3を一グループとしてページングさせたい。

記事A>カテゴリ:1
記事B>カテゴリ:2
記事C>カテゴリ:3
記事D>カテゴリ:1

ページング機能で引数をtrueにしてると同一カテゴリでページングすることがアダとなり。記事Aで次へを押すと、本当は記事Bに飛んで欲しいところ記事Dに飛んでしまう。

ということで、以下の対応。

記事A>カテゴリ:1、4
記事B>カテゴリ:2、4
記事C>カテゴリ:3、4
記事D>カテゴリ:1、4

カテゴリ4をページング用として設定。

そうすると、カテゴリ4が共通ということで遷移する・・・けど、記事一覧に表に出てほしくないページング制御用のカテゴリが出てしまう。
ということで、1,2、3などフロント用のカテゴリだけを出すために先頭の一つだけ出力!

先頭の一つだけカテゴリ出力(リンク無し)

<?php
$category = get_the_category();
echo $category[0]->cat_name;
?>

先頭の一つだけカテゴリ出力(リンク有り)

<?php
$category = get_the_category();
if ( $category[0] ) {
echo '<a href="' . get_category_link( $category[0]->term_id ) . '">' . $category[0]->cat_name . '</a>';
}
?>

先頭の二つだけ出力・・・とかになったときはまたその時調べます。

archive.phpなどループ処理で記事の表示件数やカテゴリーを指定する方法

archive.phpとかいじるとうまくいかないことっていっぱいあったけど何かうまくいきました。

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>
<div class="post"><?php the_content(); ?></div>
<?php endwhile; ?>
<?php else: ?>
<h2>記事がありません</h2>
<?php endif; ?>

上のループ処理は、記事があればタイトルをタグで、本文を「post」というクラス名の付いたタグで括った状態で表示し、この処理を記事がある分だけ繰り返して行ってください、そして記事がなければ「記事がありません」という文字列をタグで括って表示してください、という意味です。
このループ処理の開始タグの前に1行追加し「どんな記事を探してくるか」などの条件を付加してやることで、表示件数を指定したり、特定のカテゴリーのみを抽出して一覧表示できるようになります。

カテゴリーIDが1,3,5の記事を10個表示する
これがわかればあとは応用

<?php query_posts('cat=1,3,5&posts_per_page=10'); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

除外系も。

カテゴリーIDが1,3,5以外の記事を10個表示する

<?php query_posts('cat=-1,-3,-5&posts_per_page=10'); ?>
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

一つのパーツに複数のウィジェットを入れる

サイドバーで使ってるウィジェットとフッターで使ってるウィジェットを共通化したい時は滅多にないと思う。
けど、要するにそういうことをしたいとき(謎

<!-- ウィジェット1 -->
<?php if(!function_exists('dynamic_sidebar') || !dynamic_sidebar('sidebar1')): ?>
<p>ウィジェットが設定されていない場合、ここが表示されます。</p>
<?php endif; ?>
<!-- ウィジェット2 -->
<?php if(!function_exists('dynamic_sidebar') || !dynamic_sidebar('sidebar2')): ?>
<p>ウィジェットが設定されていない場合、ここが表示されます。</p>
<?php endif; ?>

正直なところ、sidebar.phpを2つも3つも作ったとき、上半分はサイドバー毎に違うけど、下半分は同じなんだよなってときに使います。
同じウィジェットパーツ沢山つくるのも面倒ですので₍₍ ◝(‘ω’◝) ⁾⁾ ₍₍ (◟’ω’)◟ ⁾⁾