現在のページのスラッグを取得するにはどうすればよいですか?
11 回答
- 投票
-
- 2012-02-13
グローバル変数
$post
を使用します:<?php global $post; $post_slug = $post->post_name; ?>
Use the global variable
$post
:<?php global $post; $post_slug = $post->post_name; ?>
-
ありがとうございました.あなたのソリューションはうまく機能します.ナメクジをエコーする必要があります: `post_name;エコー$post_slug; ?> `Thank you. Your solution works great. Just need to echo the slug: `post_name; echo $post_slug; ?>`
- 4
- 2012-02-13
- sarytash
-
sarytashが言ったように、あなたはそれを「エコー」する必要があります.したがって、これは理想的です: `post_name;?> `Like sarytash said, you need to `echo` it. So, this'd be ideal: `post_name; ?>`
- 2
- 2013-10-11
- its_me
-
[`$ WP_Post`](https://codex.wordpress.org/Class_Reference/WP_Post)はどうですか?What about [`$WP_Post`](https://codex.wordpress.org/Class_Reference/WP_Post)?
- 0
- 2019-04-24
- Peter Mortensen
-
- 2015-05-20
他の回答と同様に、スラッグは
post_name
プロパティに保存されます.直接アクセスすることはできますが、適切なAPIがない投稿プロパティにアクセスするには(十分に活用されていない)get_post_field()
関数を使用することをお勧めします.明示的に提供された投稿が必要であり、デフォルトでは現在の投稿ではないため、現在の投稿の場合は次のようになります.
$slug = get_post_field( 'post_name', get_post() );
As per other answers, slug is stored in the
post_name
property. While it could be accessed directly, I prefer the (underused)get_post_field()
function for accessing post properties which have no proper API for them.It requires post provided explicitly and doesn't default to the current one, so in full for the current post it would be:
$slug = get_post_field( 'post_name', get_post() );
-
ループ内にいる場合は、2番目の引数なしで `get_post_field`を使用できることに注意してください([docs](https://developer.wordpress.org/reference/functions/get_post_field/))It is worth noting that if you are in the loop you can use `get_post_field` without second argument ([docs](https://developer.wordpress.org/reference/functions/get_post_field/))
- 13
- 2016-06-16
- jmarceli
-
- 2015-05-21
2016年4月5日編集
信頼性を高めるために掘り下げた後、私はこの編集につながる次の投稿に対して
この回答を行うことになりました:(必ずチェックしてください) これまでに思いついた最も信頼できる方法は次のとおりです.
// Get the queried object and sanitize it $current_page = sanitize_post( $GLOBALS['wp_the_query']->get_queried_object() ); // Get the page slug $slug = $current_page->post_name;
このようにして、毎回正しいデータを取得できると99.9999%確信できます.
元の回答
この問題のもう1つの安全な代替方法は、現在クエリされているオブジェクトを保持する
get_queried_object()
を使用して、post_name
プロパティによって保持されるページスラッグを取得することです.これは、テンプレートのどこでも使用できます.$post
は使用できますが、カスタムクエリまたはカスタムコードが$post
の値を変更する可能性があるため、信頼性が低い可能性があるため、外部では使用しないでください.ループ.get_queried_object()
を使用して現在のページオブジェクトを取得する方がはるかに信頼性が高く、メインを壊す邪悪なquery_posts
を使用していない限り、変更される可能性は低くなります.オブジェクトをクエリしますが、それはすべてあなた次第です.上記は次のように使用できます
if ( is_page() ) $slug = get_queried_object()->post_name;
EDIT 5 APRIL 2016
After digging for more reliability, I ended up doing this answer to the following post which leads to this edit: (Be sure to check it out)
The most reliable method till date I could come up with is the following:
// Get the queried object and sanitize it $current_page = sanitize_post( $GLOBALS['wp_the_query']->get_queried_object() ); // Get the page slug $slug = $current_page->post_name;
This way, you are 99.9999% sure that you get the correct data every time.
ORIGINAL ANSWER
Another safer alternative to this problem is using
get_queried_object()
which holds the current queried object to get the page slug which is held by thepost_name
property. This can be used anywhere in your template.$post
can be used, but it can be unreliable as any custom query or custom code can change the value of$post
, so it should be avoided outside of the loop.Using
get_queried_object()
to get the current page object is much more reliable and is less likely to be modified, unless you are using the evilquery_posts
which breaks the main query object, but then that is all up to you.You can use the above as follow
if ( is_page() ) $slug = get_queried_object()->post_name;
-
`query_posts`は***メインクエリを変更したい場合***悪ではないと言わなければなりませんが、通常は変更せず、誤用されることがよくあります:)I must say that `query_posts` is not evil ***when you want to alter the main query***, which however you usually don't and is often misused :)
- 0
- 2018-03-03
- jave.web
-
-
これはパーマリンクの設定によって異なります.「シンプル」設定を使用すると、リンクは「http://domain/?p=123」のようになり、「?p=123」のままになります.this depends on the permalink settings. If you use the "simple" setting, links will look like `http://domain/?p=123`, leaving you with `?p=123`.
- 4
- 2016-10-14
- Mene
-
@Meneは本当ですが、問題はスラッグを取得する方法です.これは通常、URLにスラッグがあることを意味します(GET arg `p`はスラッグではありません).@Mene true, but question is how to get slug which, usually, means there is one in the url (GET arg `p` is not a slug).
- 1
- 2020-02-17
- jave.web
-
これはとても素敵なワンライナーです:DThis is such a neat one liner :D
- 0
- 2020-03-13
- Sean Doherty
-
-
- 2012-02-13
コード例を考えると、本当に必要なのはリンクのようです.その場合、ループの外で使用できるget_permalink()を使用できます.これにより、ポストスラッグを使用するよりも確実に必要なことができるはずです.
Given the code example, it looks like what you really need is a link. In that case, you can use get_permalink(), which can be used outside of the loop. That should do what you need more reliably than using the post slug.
-
これは完全なURLですが、スラッグだけではありません.This is the full URL though, not just the slug.
- 4
- 2014-11-21
- Fred
-
- 2017-08-29
古い質問かもしれませんが、私はあなたの答えに基づいて関数get_the_slug()とthe_slug()を作成しました.
if ( !function_exists("get_the_slug") ) { /** * Returns the page or post slug. * * @param int|WP_Post|null $id (Optional) Post ID or post object. Defaults to global $post. * @return string */ function get_the_slug( $id = null ){ $post = get_post($id); if( !empty($post) ) return $post->post_name; return ''; // No global $post var or matching ID available. } /** * Display the page or post slug * * Uses get_the_slug() and applies 'the_slug' filter. * * @param int|WP_Post|null $id (Optional) Post ID or post object. Defaults to global $post. */ function the_slug( $id=null ){ echo apply_filters( 'the_slug', get_the_slug($id) ); } }
Might be an old question, but I created the functions get_the_slug() and the_slug() based on your answers.
if ( !function_exists("get_the_slug") ) { /** * Returns the page or post slug. * * @param int|WP_Post|null $id (Optional) Post ID or post object. Defaults to global $post. * @return string */ function get_the_slug( $id = null ){ $post = get_post($id); if( !empty($post) ) return $post->post_name; return ''; // No global $post var or matching ID available. } /** * Display the page or post slug * * Uses get_the_slug() and applies 'the_slug' filter. * * @param int|WP_Post|null $id (Optional) Post ID or post object. Defaults to global $post. */ function the_slug( $id=null ){ echo apply_filters( 'the_slug', get_the_slug($id) ); } }
-
- 2019-04-09
正直なところ、どの答えも単純に理解できない理由はわかりません.
global $wp; $current_slug = $wp->request; // Given the URL of https://example.com/foo-bar if ($current_slug === 'foo-bar') { // the condition will match. }
これは、すべての投稿、ページ、カスタムルートで機能します.
I honestly don't understand why none of the answers simply do:
global $wp; $current_slug = $wp->request; // Given the URL of https://example.com/foo-bar if ($current_slug === 'foo-bar') { // the condition will match. }
This works for all posts, pages, custom routes.
-
「正直なところ、答えのどれも単純に何もしないのかわかりません:...」おそらく `$ wp-> request`がURLの*フル*パス部分を含み、***サブフォルダを含む***.このコードは、ルートレベルの投稿/ページでのみ機能します."I honestly don't understand why none of the answers simply do:..." Probably because `$wp->request` includes the *full* path part of the URL, ***including sub-folders***. This code will only work on posts/pages that are at root level.
- 1
- 2020-05-08
- FluffyKitten
-
これがこの質問に対する最良の答えです-私がこれを試すまで何も機能しませんでした.This is the best answer to this question - nothing worked until I tried this.
- 0
- 2020-08-14
- Chris
-
- 2018-03-23
より詳細な回答が必要な場合は、次のSQLクエリを使用して、フックがまったく起動されていない場合でも、投稿、ページ、またはカスタム分類のいずれかであるすべての投稿をいつでもフェッチできます.まだです.
生のSQL:
SELECT `id`, `post_type` AS `type`, `post_author` AS `author`, `post_name` AS `slug`, `post_status` AS `status` FROM wp_posts WHERE `post_type` NOT IN ('attachment', 'nav_menu_item', 'revision') AND `post_status` NOT IN ('draft', 'trash') ORDER BY `id`;
これは、
mu_plugins_loaded
またはinit
フックの前であっても、関数ファイルの最初の行でも機能します.@note
これは、標準のデータベースプレフィックス
wp_posts
があることを前提としています.可変プレフィックスを考慮する必要がある場合は、次の手順を実行することで、PHPを介して正しい投稿テーブルを非常に簡単に取得できます.<?php global $wpdb; $table = $wpdb->posts; $query = "SELECT `id`, `post_type` AS `type`, `post_author` AS `author`, `post_name` AS `slug`, `post_status` AS `status` FROM " . $table . " WHERE `post_type` NOT IN ('attachment', 'nav_menu_item', 'revision') AND `post_status` NOT IN ('draft', 'trash') ORDER BY `id`;"
次に、
$wpdb
、mysqli
、またはPDO
インスタンスのいずれかで実行します.このクエリにはユーザー入力がないため、変数を挿入しない限り、プリペアドステートメントなしで実行しても安全です.これをクラスのプライベート静的値として保存することをお勧めします.これにより、次のように、ページごとに2回以上クエリを実行しなくてもアクセスできるようになります.
class Post_Cache { private static $post_cache; public function __construct() { //This way it skips the operation if it's already set. $this->initCache(); } public function get($id, $type = null) { if ( !(is_int( $id ) && array_key_exists( $id, self::$post_cache ) ) ) return false; } if ( !is_null( $type ) ) { //returns the specific column value for the id return self::$post_cache[$id][$type]; } //returns the whole row return self::$post_cache[$id]; } private function initCache() { if ( is_null(self::$post_cache) ) { $query = "..."; $result = some_query_method($query); //Do your query logic here. self::$post_cache = $result; { } }
使用法
$cache = new \Post_Cache(); //Get the page slug $slug = $cache->get( get_the_ID(), 'slug'); if ($cache->get( get_the_ID() )) { //post exists } else { //nope, 404 'em } if ( $cache->get( get_the_ID(), 'status') === 'publish' ) { //it's public } else { //either check current_user_can('whatever_permission') or just 404 it, //depending whether you want it visible to the current user or not. } if ( $cache->get( get_the_ID(), 'type') === 'post' ) { //It's a post } if ( $cache->get( get_the_ID(), 'type') === 'page' ) { //It's a page }
要点がわかります.さらに詳細が必要な場合は、
を使用して通常どおりに取得できます.new \WP_Post( get_the_ID() );
これにより、ワードプレスループがリクエストに同意できるポイントに達していない場合でも、いつでも投稿を確認できます.これは、Wordpressコア自体によって実行される同じクエリの少し最適化されたバージョンです.これは、返されたくないすべてのジャンクを除外し、関連する作成者ID、投稿タイプ、スラッグ、および可視性を含む適切に整理されたリストを提供します.さらに詳細が必要な場合は、
new \WP_Post($id);
を使用して通常どおりにフェッチするか、他のネイティブWordpress関数を関連するテーブル行のいずれかで使用できます.ループ.私はいくつかの独自のカスタムテーマとプラグインで同様の設定を使用していますが、それは非常にうまく機能します.また、安全であり、Wordpressのほとんどのもののようにオーバーライドできるグローバルスコープ内に内部データが浮かんでいることはありません.
If you want a more under-the-hood answer, you can use the following SQL query to fetch all of the posts that are either posts, pages, or custom taxonomies at any time, even if no hooks have fired whatsoever as of yet.
Raw SQL:
SELECT `id`, `post_type` AS `type`, `post_author` AS `author`, `post_name` AS `slug`, `post_status` AS `status` FROM wp_posts WHERE `post_type` NOT IN ('attachment', 'nav_menu_item', 'revision') AND `post_status` NOT IN ('draft', 'trash') ORDER BY `id`;
This works even on the very first line of your functions file, even prior to the
mu_plugins_loaded
orinit
hooks.@note
This is assuming you have a standard database prefix
wp_posts
. If you need to account for variable prefixes, you can obtain the correct post table through PHP pretty easily by doing the following:<?php global $wpdb; $table = $wpdb->posts; $query = "SELECT `id`, `post_type` AS `type`, `post_author` AS `author`, `post_name` AS `slug`, `post_status` AS `status` FROM " . $table . " WHERE `post_type` NOT IN ('attachment', 'nav_menu_item', 'revision') AND `post_status` NOT IN ('draft', 'trash') ORDER BY `id`;"
Then run with either
$wpdb
,mysqli
, or aPDO
instance. Since there is no user input in this query, it is safe to run without a prepared statement as long as you do not inject any variables into it.I would suggest storing this as a private static value of a class, so it can be accessed without having to fire the query again more than once per page for best performance, something like this:
class Post_Cache { private static $post_cache; public function __construct() { //This way it skips the operation if it's already set. $this->initCache(); } public function get($id, $type = null) { if ( !(is_int( $id ) && array_key_exists( $id, self::$post_cache ) ) ) return false; } if ( !is_null( $type ) ) { //returns the specific column value for the id return self::$post_cache[$id][$type]; } //returns the whole row return self::$post_cache[$id]; } private function initCache() { if ( is_null(self::$post_cache) ) { $query = "..."; $result = some_query_method($query); //Do your query logic here. self::$post_cache = $result; { } }
Usage
$cache = new \Post_Cache(); //Get the page slug $slug = $cache->get( get_the_ID(), 'slug'); if ($cache->get( get_the_ID() )) { //post exists } else { //nope, 404 'em } if ( $cache->get( get_the_ID(), 'status') === 'publish' ) { //it's public } else { //either check current_user_can('whatever_permission') or just 404 it, //depending whether you want it visible to the current user or not. } if ( $cache->get( get_the_ID(), 'type') === 'post' ) { //It's a post } if ( $cache->get( get_the_ID(), 'type') === 'page' ) { //It's a page }
You get the gist. If you need further details, you can fetch them as per normal with
new \WP_Post( get_the_ID() );
This will let your check the posts at any time, even if the wordpress loop has not hit a point where it finds your request agreeable. This is a slightly more optimized version of the same query run by the Wordpress core itself. This one filters out all of the junk you would not want returned, and just gives you a nicely organized list with the relevant author id, post type, slug, and visibility. If you need further details, you can fetch them as per normal with
new \WP_Post($id);
, or use any of the other native Wordpress functions with any of the relevant table rows, even outside of the loop.I use a similar setup in a couple of my own custom themes and plugins, and it works pretty great. It's also secure and doesn't leave internal data floating around in the global scope where it can be overridden like most stuff in Wordpress does.
-
- 2018-11-24
これは、ループの外側のスラッグを取得するときに使用する関数です.
get_post_field( 'post_name');
ここにある回答:現在のページのスラッグを取得する方法WordPressで?
This is the function to use when wanting to retrieve the slug outside of the loop.
get_post_field( 'post_name');
Answer found here: How to Retrieve the Slug of Current Page in WordPress?
-
確かに、しかし、2番目の引数として$postまたは投稿のIDを渡す必要があります.Indeed, but you need to pass $post or ID of the post as a second argument.
- 0
- 2019-10-17
- trainoasis
-
- 2015-02-12
@Matthew Boynesの回答のさらに先で、親ナメクジ(もしあれば)を取得することに興味がある場合は、この関数が便利であることがわかりました:
function mytheme_get_slugs() { if ( $link = get_permalink() ) { $link = str_replace( home_url( '/' ), '', $link ); if ( ( $len = strlen( $link ) ) > 0 && $link[$len - 1] == '/' ) { $link = substr( $link, 0, -1 ); } return explode( '/', $link ); } return false; }
たとえば、スラグをボディクラスに追加するには:
function mytheme_body_class( $classes ) { if ( $slugs = mytheme_get_slugs() ) { $classes = array_merge( $classes, $slugs ); } return $classes; } add_filter( 'body_class', 'mytheme_body_class' );
Just further on @Matthew Boynes answer, if you're interested in getting the parent slug (if any) also then I've found this function useful:
function mytheme_get_slugs() { if ( $link = get_permalink() ) { $link = str_replace( home_url( '/' ), '', $link ); if ( ( $len = strlen( $link ) ) > 0 && $link[$len - 1] == '/' ) { $link = substr( $link, 0, -1 ); } return explode( '/', $link ); } return false; }
Eg to add the slug(s) to the body class:
function mytheme_body_class( $classes ) { if ( $slugs = mytheme_get_slugs() ) { $classes = array_merge( $classes, $slugs ); } return $classes; } add_filter( 'body_class', 'mytheme_body_class' );
-
- 2017-02-14
WordPressでの動的ページ呼び出し.
<?php get_template_part('foldername/'.basename(get_permalink()),'name'); ?>
Dynamic Page calling in WordPress.
<?php get_template_part('foldername/'.basename(get_permalink()),'name'); ?>
ループの外で現在のWordPressページのスラッグを取得しようとしています.ページのタイトルは
wp_title ()
で返されますが、どうすればスラッグを取得できますか?