web-dev-qa-db-ja.com

ページを作成せずに特定のURLにテンプレートファイルを使用する

そのテンプレート用のページを作成しなくても、特定のURL用のテンプレートファイルを使用することは可能かどうかと思います。

これは私の単純化された問題です:

WPに、末尾のフォームデータを含む特定のURLを指すリンクコンテンツを含むページを作成しました: (mysite.com/retail/?a=test&b=1234)

Url(retail)に、私がchildテーマディレクトリにあるテンプレートファイルtemplate-retail.phpを自動的に使うようにしたいです。そこでは、 "retail"という名前のページを作成してそこからテンプレートページを選択する必要はありません。 template-retail.phpファイルには外部コンテンツしかなく、Wordpress自体からのものはありません。

これは可能ですか?

11
Keat

あなただけのURLを見て、ファイルをロードして終了することができます。

WordPressがその環境をロードしたときにそれを行うことができます。 'init'にあります。

add_action('init', function() {
  $url_path = trim(parse_url(add_query_arg(array()), PHP_URL_PATH), '/');
  if ( $url_path === 'retail' ) {
     // load the file if exists
     $load = locate_template('template-retail.php', true);
     if ($load) {
        exit(); // just exit if template was found and loaded
     }
  }
});

そうすることで、スラッグ "小売り"を含む real ページは決して使用できないことに注意してください。

これは非常に簡単ですが、ハードコーディングされているので、単一のページにこれが必要な場合は問題ありません。もっと多くのURLを制御する必要がある場合は、 この答え で提案されている解決策をご覧ください。

12
gmazzap

initアクションはあなたが達成しようとしていることには適していません。代わりにtemplate_includeフィルタを使うべきです。これをget_query_varと組み合わせてURLパラメータを取得し、どのテンプレートを読み込む必要があるかを確認します。これがリンクです。

コード:

add_filter( 'template_include', 'portfolio_page_template', 99 );

function portfolio_page_template( $template ) {

    if ( is_page( 'portfolio' )  ) {
        $new_template = locate_template( array( 'portfolio-page-template.php' ) );
        if ( '' != $new_template ) {
            return $new_template ;
        }
    }

    return $template;
}
4
adamj

これを行うWordPressの方法はpage-templatesです。 https://developer.wordpress.org/themes/template-files-section/page-template-files/ /

WordPressテンプレート用のコードだけが必要です。 WordPressテーマでは、ページテンプレートを作成して名前を変更することができます。

page-id.php

その特定のページは自動的にそれを拾い上げてテンプレートを使用します。

たとえば、ページのIDが5874の場合、テンプレートの名前はpage-5784.phpになります。

ページスラッグに基づいてテンプレートに名前を付けることもできます。たとえば、ページのスラッグがhello-worldの場合、テンプレート名はpage-hello-world.phpになります。

- https://developer.wordpress.org/files/2014/10/template-hierarchy.png も参照してください。

1

@ shivanand-sharmaこれは完璧でクリーンな方法です( https://developer.wordpress.org/themes/template-files-section/page-template-files/ )ワードプレスで、ページを非表示にしたい場合は、シンプルで効果的なプラグインを使用します ' https://wordpress.org/plugins/exclude-pages/ '

私はPOSTまたはGETを自分のページに作成して保存するURLが必要だったと言わなければなりませんすべての「require( 'wp-load')などを含むカスタムPHPコードのバックボーンを持つことができるため、いくつかのセッションデータ「WC()-> session」、これはこの問題および他の問題を解決します'ワードプレス全体、woocommerceなどのを介して作業する、mysite.com/index.php/MYPAGE.....

あなただけが必要です:

最初:テーマの場所に、「wp-content/themes/mytheme/customtemplate.php」のような新しいページのテンプレートとしてファイルを作成します(コメントが重要なので、テンプレート名 'はWordpressで確認できます):

<?php /* Template Name: WhateverName */ 
echo 'Hello World';echo '</br>';
var_dump(WC()->session); 
var_dump($_POST);
var_dump($_GET);
?>

Second:wordpressにページを作成します。通常は 'wp-admin'> Pages(_ mypage _のような名前を付けましょう、または必要に応じてスラッグを変更することができます)、もちろん、テンプレートの名前 'WhateverName'であるこのページのテンプレートとして前のテンプレートをリンクします属性セクション。

それでは、新しいページ 'mysite.com/index.php/MYPAGE'を開いてみましょう。

Hello World
object(WC_Session_Handler)#880 .....................

Extras:「script」HTMLタグ内で想像できるものは何でも、カート、チェックアウトでjavascriptまたはjquery関数を作成し、次のようなコードを含めます。

var data = { action : actionName, dataA : etcA, dataB : etcB}
$.ajax({
    type:     'post',
    url:      'index.php/MYPAGE',
    data:     data,
    success:  function( response ) {
    },
    complete: function() {
    }
});
0
Jose Velandia