フォーラムへの返信

15件の返信を表示中 - 31 - 45件目 (全297件中)
  • フォーラム: 使い方全般
    返信が含まれるトピック: 日替わりで投稿をランダムに表示

    こんばんは、横から失礼します。

    データのリフレッシュは秒数指定ではなく日付変更を境にしたい

    キャッシュ生成の時の時間と日付の変わる時間とのタイムスタンプの差分から、その日に保存しておく秒数を取得できそうですね。

    $current_time = time(); // 現在のタイムスタンプ
    $refresh_time = mktime( 23, 59, 59 ); // 同日 23:59:59 のタイムスタンプ
    $cache_limit  = $refresh_time - $current_time; // 23:59:59 までの秒数
    トピック投稿者 mizube

    (@mizube)

    nobitaさん、お忙しいなか丁寧に検証して頂きありがとうございます。

    対応策として検証して頂いた以下について、

    以上のことから、_post_nav_menuを、いったん post_nav_menuに変更していただいて、
    新規作成時にフィールドがすでに生成されていないかどうかをチェックしてみられるといいかもしれません。

    カスタムフィールドのメタボックスに表示される、キー名の頭にアンダースコアのないメタデータは、一度保存されるとカスタムフィールドの項目として取り扱われるためきちんと動作するのではと思いました。カスタムフィールドのメタボックスにて追加・変更した値は、問題の起きているページでもきちんと反映されているからです。

    でも、対応方法としては十分ですよね。ユーザーが間違った値を入力しないよう、あくまで隠しパラメータとしておきたかったのですが、これ以上ご迷惑をお掛けするわけにはいきません。

    また、私はもう少し post_meta の扱いに対する理解を深める必要がありそうです(笑)

    動かないという点、結局再現できず ごめんなさい

    nobitaさんの検証を追ってみる必要がありますが、やはり私のコードに問題がありそうですね。そして、私もここに投稿する前に、デフォルトの環境で同じ動作が起こるものなのか、まず確かめるべきでした。その上で検証を進めていきたいと思います。

    状況が判明次第、ここに投稿させて頂きます。
    この度は本当にありがとうございました。

    トピック投稿者 mizube

    (@mizube)

    再々投稿すみません。

    ドロップダウンボックスが消えることはなく

    の重要性を読み飛ばしていました。うーん、私の環境ですと、ページテンプレートが1つもない場合には、「ページテンプレート」のドロップダウンボックスは表示されないのです。以前からそういう仕様だと記憶していたのですが・・・・・・。

    フォーラム: 使い方全般
    返信が含まれるトピック: 権限の表示名取得

    こんにちは。権限グループ名は

    $role_names = $GLOBALS['wp_roles']->get_names();

    で取得できますが、権限グループ名の翻訳は管理ページ用の翻訳ファイルに含まれています。
    管理ページ以外で権限グループ名を日本語で取得するためにはこの翻訳ファイルを読み込みつつ、translate_user_role() で翻訳する必要があります。

    load_textdomain( 'default', WP_LANG_DIR . '/admin-' . get_locale() . '.mo' );
    
    $author_roles     = get_the_author_meta( 'roles' );
    $author_role      = $author_roles[0]; // ここで任意の権限グループを配列から取得します
    $wp_role_names    = $GLOBALS['wp_roles']->get_names(); // すべての権限グループ名を連想配列で取得(英語)
    $author_role_name = translate_user_role( $wp_role_names[$author_role] ); // 翻訳
    
    // var_dump( $wp_role_names, $author_role_name );

    権限グループの数なんて知れていますから、ご自分で配列でも準備して、翻訳された方が早いかもしれません。

    $role_names = array(
        'administrator' => __( 'Administrator', 'my-theme' ),
        // ...
    );
    フォーラム: 使い方全般
    返信が含まれるトピック: WordPress固定ページでのショートコード取り除き

    こんにちは。

    私の環境で試してみましたが、きちんと取り除かれていますよ。
    ひょっとして page.php のループ内に the_content(); が含まれていませんか?

    トピック投稿者 mizube

    (@mizube)

    もう一つ、対処方法のメモ。どこかのタイミングで以下を実行。

    delete_post_meta( $post_id, '_wp_page_template' );
    // or update_post_meta( $post_id '_wp_page_template', 'default' );

    トピック投稿者 mizube

    (@mizube)

    nobita さん、丁寧なご返信ありがとうございます。

    公式にテーマを登録されているんですね! 素晴らしい! いつか私もプラグインやテーマの登録をやってみたいと思っています。いつかその時が来ましたら、ご相談に乗って頂けると嬉しいです。

    私の環境では、ドロップダウンボックスが消えることはなく、デフォルトテンプレートに戻っているようです。

    そうですね、私の環境でも、ページテンプレートを削除し、リロードすると、ページテンプレート自体はデフォルトに戻ります。問題は、それとは別の内容で、この時、設定したはずの save_post アクションフックが効かなくなってしまった(以後 update_post_meta 出来ない)、という状況なのです。

    うまく説明できておらず申し訳ありません。

    複数のページテンプレートが存在する場合は、ページをリロードすることでこの問題は解消しますが、ページテンプレートが1つのみ存在し、その1つを固定ページに設定した状態で、テンプレートファイルを削除した場合(ページ属性のメタボックスにページテンプレートのドロップダウンが表示されなくなった状態)に、削除したそのページテンプレートを設定している固定ページにおいてのみ、この状況が発生します。

    なお、見かけ上はデフォルトテンプレートに戻っているのですが、カスタムフィールドに格納されたページテンプレートの情報(_wp_page_template の値)は、削除したページテンプレートファイルのままになっており、その状態にあると(?)、save_post アクションフックを使ってのメタ情報の更新が出来ないように思います。

    一応私の書いたコードの一部を。だいたいこんな感じでテーマやプラグインを作っています。
    固定ページごとに、個別にナビゲーションメニューを設定するメタボックスを追加しようとしています。(ページテンプレートを設定していない固定ページでは動作します)

    class My_Theme_Core {
    	public $textdomain = 'my-theme';
    
    	// for silent call
    	public static function __boot() {
    		$class = __CLASS__;
    		new $class();
    	}
    
    	public function __construct() {
    		$langs_dir = basename( dirname(__FILE__) ) . '/languages/';
    		load_plugin_textdomain( $this->textdomain, false, $langs_dir );
    		$this->add_actions();
    		// ...
    	}
    
    	/*
    	 * Actions
    	 */
    	protected function add_actions() {
    		$this->add_action( 'admin_init' );
    		$this->add_action( 'save_post', 10, 2 );
    		// ...
    	}
    
    	protected function add_action( $hook, $priority=10, $num_args=1 ) {
    		$method = 'action_' . $hook;
    		$this->add_action_with_callback( $hook, $method, $priority, $num_args );
    	}
    
    	protected function add_action_with_callback( $hook, $method, $priority=10, $num_args=1 ) {
    		if ( method_exists( $this, $method ) && is_callable( array( $this, $method ) ) ) {
    			add_action( $hook, array( $this, $method ), $priority, $num_args );
    		}
    	}
    
    	public function action_admin_init() {
    		// add_meta_box();
    		// ...
    	}
    
    	public function action_save_post( $post_id, $post ) {
    		if ( !isset( $_POST['post_nav_menu_nonce'] ) )
    			return;
    
    		if ( !wp_verify_nonce( $_POST['post_nav_menu_nonce'] , 'post_nav_menu' ) )
    			return;
    
    		if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
    			return;
    
    		if ( !isset( $_POST['post_type'] ) || !post_type_exists( $_POST['post_type'] ) )
    			return;
    
    		// retrieve 'edit_post' meta-cap and check capability
    		$edit_post_cap = get_post_type_object( $_POST['post_type'] )->cap->edit_post;
    		if ( !current_user_can( $edit_post_cap, $post_id ) )
    			return;
    
    		// update post_meta value
    		if ( isset( $_POST['post_nav_menu'] ) ) {
    			$post_nav_menu = intval( $_POST['post_nav_menu'] );
    			update_post_meta( $post_id, '_post_nav_menu', $post_nav_menu );
    		}
    	}
    }
    フォーラム: 使い方全般
    返信が含まれるトピック: カスタムメニューにPHP

    URLを弄るならフィルターフック nav_menu_link_attributes が使えると思います。
    希望とは違ってしまいますが、特定のキーワードを対応する URL に変換する案を。
    テストしていませんので動作保証はしかねますが、何かのヒントになれば。

    <?php
    /*
    Plugin Name: Convert Keywords to URL in Nav Menu
    Usage: このプラグインをコピペした PHP ファイルを UTF-8 で保存し、 wp-content/plugins/ 以下にインストール後、有効化してください。
    */
    
    function cknm_filter_nav_menu_link_attributes( $atts ) {
        if ( isset( $atts['href'] ) && !empty( $atts['href'] ) ) {
            // %HOME_URL% のようなキーワードを対応するURLに変換
            $atts['href'] = preg_replace_callback( '/%([0-9a-zA-Z_]+)%/', '_cknm_callback_assign_keywords', $atts['href'] );
    
            // 連続する protocol:// を削除 ※適当
            $protocols    = implode( '|', wp_allowed_protocols() );
            $atts['href'] = esc_url( preg_replace( '#^((' . $protocols . ')://)+((' . $protocols . ')://)#', '$3', $atts['href'] ) );
        }
        return $atts;
    }
    
    function _cknm_callback_assign_keywords( $match ) {
        $search   = $match[1];
        $keywords = array(
            'HOME_URL'     => home_url('/'),
            'TEMPLATE_URL' => get_template_directory_uri(),
            'ADMIN_URL'    => admin_url('/'),
            // 必要に応じて変換するキーワードとURLを連想配列に追加してください
            // 'CUSTOM_POST_TYPE_ARCHIVE' => get_post_type_archive_link( 'custom_post_type' )
        );
        // 定義されていないキーワードはそのまま返す
        return ( isset( $keywords[$search] ) ) ? $keywords[$search] : $match[0];
    }
    
    // nav_menu_link_attributes フックにフィルターを追加
    add_filter( 'nav_menu_link_attributes', 'cknm_filter_nav_menu_link_attributes' );

    カスタムメニュー編集ページの URL 欄では、保存すると http://%HOME_URL% みたいな風に表示されてしまうんじゃないかと思いますが、実際のメニュー上ではキーワードの変換後に冒頭で連続する http:// は多分削除するので気にしないでください。

    申し訳ありませんが私はこれにて。

    ごめんなさい!

    // 子ページのページテンプレートのファイル名を取得
        $c_template = get_post_meta( $post->ID, '_wp_page_template', true );

    の部分ですが

    // 子ページのページテンプレートのファイル名を取得
        $c_template = get_post_meta( $child->ID, '_wp_page_template', true );

    に修正してください!
    $post->ID だと親ページのテンプレートをチェックしてしまいます。
    申し訳ありません。

    子ページパーツテンプレートと子ページテンプレートを作り、それを親ページで合わせて読み込むことで1つとして表示させている、という感じでしょうか。

    子ページテンプレートは、子ページにアクセスした時に表示するためのテンプレートで、子ページのパーツテンプレートは、親ページ内で読み込むテンプレートですね。

    MySQLの知識がいりますが、 $wpdb->get_results() で、条件抽出と集計をしてしまうのがいいのではないかと思います。面白そうなので、落ち着いたらテスト環境作ってやってみます。

    ただ12月になりそうなので、私の回答を待たず、他の方が回答されることを願います。

    こんにちは。

    Theme-Check というプラグインはいかがでしょうか?
    インストール・有効化後、外観 > Theme Check から使用します。
    http://wordpress.org/plugins/theme-check/

    あとは一括で開発用プラグインを入れられる Developer プラグイン。
    Theme-Check プラグインもこれ経由でインストールできます。
    http://wordpress.org/plugins/developer/

    ※いずれも開発環境で使用してくださいね。

    a1. そのままでは存在しないページです(カテゴリーページにつく /category/ や、タグページにつく /tag/ のページも存在しません)。ただし blog という固定ページが存在する場合や、フロントページの設定で最新の投稿を blog という固定ページに設定した場合はそれらが表示されます。
    a2. 存在しないページは is_404() で判定します。固定ページが存在する場合は is_page(‘blog’) ですし、フロントページの設定で最新の投稿を blog という固定ページに設定した場合は is_home() && !is_front_page() です。
    a3. home_url(‘/blog/’) でしょうか。有用とは思えませんが…。

    /blog/ に投稿の一覧が表示されるのが望ましいのでしたら、フロントページの設定を変更されてはいかがでしょうか。その他、パーマリンク構造をカスタマイズするプラグインを入れるといった選択肢もあります。フロントページで既に投稿の一覧が表示が存在されていて、/blog/ が気になるのであれば、/blog の部分は省略したほうがそれらしいのではと思います。

    が、お気持ちはよくわかります(笑)

    すみません、訂正します。子ページのパーツファイル(part-child.php)はこの場合

    <h3><?php echo $c_title; ?></h3>
    <div class="txt">
    <?php echo $c_content; ?>
    </div>

    であるべきですね。失礼しました。

    コードの掲載ありがとうございます。

    こちらの解釈が勘違いだったらごめんなさい。固定ページ「子ページ」の編集画面の「ページ属性 > テンプレート」で設定したテンプレートを、固定ページ「親ページ」内で読み込みたい、ということでしょうか?

    現状そういうコードにはなってない(単に子ページのデータを引っ張ってきてループ内のHTMLにデータを埋め込んで出力してる)ので、コードの修正が必要です。また、現状のテンプレートを子ページに適用してると、子ページのURLにアクセスした時、そのテンプレートが適用されてしまい、パーツだけのページが表示されてしまいますので、あまりよろしくないと思います。

    例えば、以下のような方法はどうでしょうか。

    まず、子ページ用テンプレートである child.php (仮)を通常のテンプレートファイルのように作成し、子ページのテンプレートに設定します。中身は自由に変えても良いし、以下のように、デフォルトのテンプレート page.php を読み込むだけでもいいです。

    child.php (子ページ用テンプレート・仮名) :

    <?php
    /*
    Template Name: Child
    */
    get_template_part( 'page' );
    ?>

    次に、親ページの中で読み込ませるパーツだけのファイルを新しく作成します。このファイル名は、子ページ用テンプレートのファイル名 (child.php) の頭に何かキーワードをつけ、ハイフンで区切った名前にします。今回は part をつけ、part-child.php にしてみます。
    ※このへんのルールはなんでもいいのですが、子ページ用テンプレートのファイル名と子ページパーツのファイル名が何らかの形で対応している必要があります。

    part-child.php (子ページ用テンプレートに対応したファイル名の子ページパーツ・仮名):

    <h3><?php the_title(); ?></h3>
    <p class="txt">
    <?php the_content(); ?>
    </p>

    で、最後に、親ページのループに、子ページ用テンプレートに応じて、読み込む子ページパーツのファイルを変える、という処理を加えます。親ページもテンプレートにしておくといいですね。以下の親ページ用テンプレートを作成し、親ページのテンプレートに設定します。

    parent.php (親ページ用テンプレート・仮名) :

    <?php
    /*
    Template Name: Parent
    */
    get_header();
    ?>
    <div id="page">
    <?php
    $child_posts = get_posts( 'numberposts=-1&order=ASC&orderby=post_title&post_type=page&post_parent=' . $post->ID );
    if ( $child_posts ) {
      foreach ( $child_posts as $child ) {
        $c_title = apply_filters( 'the_title', $child->post_title );
        $c_content = get_extended( $child->post_content );
        $c_content = apply_filters( 'the_content', $c_content['main'] );
        // 子ページのページテンプレートのファイル名を取得
        $c_template = get_post_meta( $post->ID, '_wp_page_template', true );
        // part ファイルのパスを、ファイルの命名ルールに応じて設定
        $c_part = get_template_directory() . '/part-' . $c_template;
        // テンプレートがデフォルトでなく part ファイルが存在したら読み込む
        if ( $c_template != 'default' && file_exists( $c_part ) ) {
          // get_template_part() だと自前の変数には global 宣言がいるので include で
          include $c_part;
        } else {
          // テンプレート指定がない場合と、パーツファイルが存在しない場合
    ?>
    <?php echo $c_title; ?>
    <div class="entry">
    <?php echo $c_content; ?>
    </div>
    <?php
        }
      }
    } else {
      // 子ページが存在しない場合
    ?>
    <div class="entry">
    <p class="msg">これより下の階層のページはありません。</p>
    </div>
    <?php
    }
    ?>
    </div>
    <?php get_footer(); ?>

    いかがでしょう?

    Pite さんのコードで確認すべきポイントは $cat_now でカテゴリーを取得しているのに、親カテゴリー $parent では $cat を参照している点です。$catはどこの子…?ってことですね。
    あと、child_of で現在のカテゴリのIDを指定すればその子カテゴリーのリストがでます。
    親カテゴリーなら子カテゴリー、子カテゴリーなら孫カテゴリーのリスト。
    で、孫カテゴリーには子がないので、何も出力されません。

    <?php
    $cat_now = get_the_category();
    $cat_now = $cat_now[0];
    wp_list_categories( "title_li=&child_of={$cat_now->term_id}&depth=1&show_count=1" );
    ?>

    親だとか子だとか孫だとか呼んで考えてたら、ややこしくなってしまいますね…。
    回答中に混乱してしまいました(笑)

15件の返信を表示中 - 31 - 45件目 (全297件中)