Get permalink


Сегодня, публикую перевод небольшой статьи о создании весьма полезного шорткода, кстати если вы еще не слышали о шорткодах, можете прочитать в моей предыдущей статье.

Во время создания шаблона для WordPress, у вас может возникнуть необходимость указать ссылку на конкретную страницу прямо в шаблоне. Для этого есть специальная функция, которую вы можете использовать.

Плохой пример:

  <a href="/contact/">Контакты</a>  

Хороший пример:

  <a href="<?php echo get_permalink(12); ?>">Контакты</a>  

Здесь «12» — это ID нужной записи или страницы. Почему же этот способ правильней?

  • ссылка будет работать, даже если вы измените структуру ссылок;
  • ссылка будет работать, даже если сайт будет перенесен с субдомена (который вы использовали для тестирования) на домен верхнего уровня.

Используя вышеуказанную функцию, ссылки на ваши записи и страницы никогда не изменятся. Это очень удобно использовать, при работе с файлами нашей темы, но как насчет использования ссылок на страницах и записях в визуальном редакторе?

По умолчанию, мы не можем выполнять PHP-код внутри нашей страницы или записи, а следовательно нет возможности использовать функцию get_permalink. Что мы можем сделать, так это создать специальный шорткод, с точно такой же функциональностью. И вот он:

  function permalink_thingy($atts) {  	extract(shortcode_atts(array(  		'id' => 1,  		'text' => "" // значение по умолчанию, если ничего не указано   ), $atts));      if ($text) {   $url = get_permalink($id);   return "<a href='$url'>$text</a>";   } else {  	 return get_permalink($id);  	}  }  add_shortcode('permalink', 'permalink_thingy');  

Этот шорткод можно использовать двумя способами:

Просто:

  <a href="[permalink id=49]">Использование без текста</a>  

Здесь вам нужно просто указать параметр id и шорткод вернет URL. Полученный URL можно использовать любым способом, например, если вам нужно присвоить ссылке определенный класс или еще для чего-нибудь.

С текстом:

  [permalink id=49 text='providing text']  

Этот способ вернет полностью форматированную ссылку, с текстом, который вы указали.

Перевод статьи «Easy Shortcode Permalinks», автор Chris Coyier

dreamhelg.ru

Definition and Syntax

The get_permalink()


function makes it possible for you to retrieve the current post’s permalink. It’s syntax goes like below:

 <?php $permalink = get_permalink( $id, $leavename ); ?> 

You see that this function takes two parameters, both optional. The first one, $id, is the one which allows you to manually modify the ID of the post, therefore making you able to choose the post whose permalink you want by it. Obviously, the default value of this parameter is the current post’s ID.

The second one, $leavename, is a boolean operator (that takes either TRUE or FALSE values) that defines the structure of the permalink you will get, or specifically, whether to include the post’s name or just keep the page’s name. To make it more clear, let’s suppose we have set this parameter to FALSE. Instead of getting a result similar to http://www.mywebsite.com/current-post


, we will get this one: http://www.mywebsite.com/%currentpostname%. The default value for this parameter is FALSE.

Usage

We mentioned before that we can use the get_permalink() function to get the permalink of both the current post and also others’. Let’s see how we can do these in real life!

Showing current post’s permalink

The easiest and most straightforward way to use the function is to find out the current post’s permalink. See the code snippet below:

 <?php $permalink = get_permalink(); echo $permalink; ?> 

As you might notice, it’s just the syntax, we haven’t defined either parameter.

Showing a certain post’s permalink

We can choose the post whose permalink we want by specifying the $id parameter as seen in the code below:

 <?php $permalink = get_permalink(16); echo $permalink; ?> 

This way, we have required the information regarding the post with the ID 16.

Showing a certain post’s permalink structure

We can find out a specific post’s permalink structure by displaying the post’s permalink with it’s name. Take a look at the code snippet below:

 <?php $permalink = get_permalink(16, true); echo $permalink; ?> 

If the permalink of the post whose ID is 16


is something like http://www.mywebsite.com/sixteen when we use the code snippet above, then when we use this line of code it’ll be similar to http://www.mywebsite.com/2015/10/sixteen, or whatever permalink structure you already have set.

Download the source code

This was an example of get_permalink in WordPress.

Download the source code for this tutorial:

www.webcodegeeks.com

Функция get_post_permalink() получает ссылку на сообщение в зависимости от своей «постоянной» ссылки плюс ваши пользовательские правила перезаписи, которые меняются ?p=123


в, например, в my-beautiful-sunday-diary . Функция get_permalink() более «базовая», но также более универсальна в том, что она делает: для post_type of

  • page , он использует get_page_link()
  • attachment , оно использует get_attachment_link()
  • post , он использует get_post_link()

Он также обрабатывает отображение term


s и даты. В конце он либо заменяет «симпатичную» ссылку в home_url() либо просто возвращает необработанную ссылку, если не были назначены пользовательские правила перезаписи. Наконец, он присоединяет общий фильтр:

 /** * Filters the permalink for a post. * * Only applies to posts with post_type of 'post'. * * @since 1.5.0 * * @param string $permalink The post's permalink. * @param WP_Post $post The post in question. * @param bool $leavename Whether to keep the post name. */ return apply_filters( 'post_link', $permalink, $post, $leavename );  

Надеюсь, что это прояснит тему.

ProTip: Если вам нужно изменить peramlinks в плагине, перейдите к определенным фильтрам внутри get_attachment_link() , get_post_link() и т. Д. Только если вы либо работаете на одном сайте и не планируете распространять свой код, либо если.


x444;ильтром выше. Кроме того, вы будете наносить урон каждой теме авторов и запускать приоритетную гонку обратного вызова.

www.wordpressask.com

function get_permalink( $post = 0, $leavename = false ) { 	$rewritecode = array( .  

name, $sample); elseif ( $post->post_type == 'attachment' ) return get_attachment_link( $post, $leavename ); elseif ( in_array($post->post_type, get_post_types( array('_builtin' => false) ) ) ) return get_post_permalink($post, $leavename, $sample); $permalink = get_option('permalink_structure'); /** * Filters the permalink structure for a post before token replacement occurs. * * Only applies to posts with post_type of 'post'. * * @since 3.0.0 * * @param string $permalink The site's permalink structure. * @param WP_Post $post The post in question. * @param bool $leavename Whether to keep the post name. */ $permalink = apply_filters( 'pre_post_link', $permalink, $post, $leavename ); if ( '' != $permalink && !in_array( $post->post_status, array( 'draft', 'pending', 'auto-draft', 'future' ) ) ) { $unixtime = strtotime($post->post_date); $category = ''; if ( strpos($permalink, '%category%') !== false ) { $cats = get_the_category($post->ID); if ( $cats ) { $cats = wp_list_sort( $cats, array( 'term_id' => 'ASC', ) ); /** * Filters the category that gets used in the %category% permalink token.

* * @since 3.5.0 * * @param WP_Term $cat The category to use in the permalink. * @param array $cats Array of all categories (WP_Term objects) associated with the post. * @param WP_Post $post The post in question. */ $category_object = apply_filters( 'post_link_category', $cats[0], $cats, $post ); $category_object = get_term( $category_object, 'category' ); $category = $category_object->slug; if ( $parent = $category_object->parent ) $category = get_category_parents($parent, false, '/', true) . $category; } // show default category in permalinks, without // having to assign it explicitly if ( empty($category) ) { $default_category = get_term( get_option( 'default_category' ), 'category' ); if ( $default_category && ! is_wp_error( $default_category ) ) { $category = $default_category->slug; } } } $author = ''; if ( strpos($permalink, '%author%') !== false ) { $authordata = get_userdata($post->post_author); $author = $authordata->user_nicename; } $date = explode(" ",date('Y m d H i s', $unixtime)); $rewritereplace = array( $date[0], $date[1], $date[2], $date[3], $date[4], $date[5], $post->post_name, $post->ID, $category, $author, $post->post_name, ); $permalink = home_url( str_replace($rewritecode, $rewritereplace, $permalink) ); $permalink = user_trailingslashit($permalink, 'single'); } else { // if they're not using the fancy permalink option $permalink = home_url('?p=' . $post->ID); } /** * Filters the permalink for a post. * * Only applies to posts with post_type of 'post'. * * @since 1.5.0 * * @param string $permalink The post's permalink. * @param WP_Post $post The post in question. * @param bool $leavename Whether to keep the post name. */ return apply_filters( 'post_link', $permalink, $post, $leavename ); }

developer.wordpress.org

Функция get_post_permalink() funciton получает ссылку на сообщение в зависимости от ее «постоянной» ссылки плюс ваши пользовательские правила перезаписи, которые меняют ?p=123 на, например. my-beautiful-sunday-diary. get_permalink() функция является более «основной», но и более универсален в том, что она делает: Для post_type из

  • page, он использует get_page_link()
  • attachment, он использует get_attachment_link()
  • post, он использует get_post_link()

Он также обрабатывает дисплей term s, как category, и даты постоянные. В конце он либо заменяет «симпатичную» ссылку в вашем home_url(), либо просто возвращает необработанную ссылку, если не были назначены пользовательские правила перезаписи. Наконец, он присоединяет общий фильтр:

/**  * Filters the permalink for a post.  *  * Only applies to posts with post_type of 'post'.  *  * @since 1.5.0  *  * @param string $permalink The post's permalink.  * @param WP_Post$ post The post in question.  * @param bool $leavename Whether to keep the post name.  */  return apply_filters('post_link',$ permalink, $post,$ leavename);  

Надеюсь, что уточнит тему.

ProTip: Если вам нужно изменить peramlinks в плагине, идут с определенными фильтрами внутри get_attachment_link(), get_post_link() и т.д. Только если вы либо работаете на одном месте и не планируете распространять код или если вы написав плагин, предназначенный только для перезаписи, затем перейдите с общим фильтром выше. Кроме того, вы будете наносить урон каждой теме авторов и запускать приоритетную гонку обратного вызова.

wordpress.stackovernet.com

Get Permalink By Slug

If you’re looking to get the permalink by the slug, then you need to know two things:

  • A page’s slug is usually the post name unless you’ve done something else programmatically. Review this Codex article for more information.
  • The get_permalink function can accept an ID or an actual object. I’m a fan of passing the ID. I think it makes for cleaner code when comparing it to the Codex documentation.

So with that said, let’s assume that there’s a page that has the slug: “Register For This Site.” Since the slug is often the page’s title, we can write the following function:

 function theme_get_permalink_by_title( $title ) {   // Initialize the permalink value  $permalink = null;   // Try to get the page by the incoming title  $page = get_page_by_title( strtolower( $title ) );   // If the page exists, then let's get its permalink  if( null != $page ) {  $permalink = get_permalink( $page->ID );  } // end if   return $permalink;  } // end theme_get_permalink_by_title 
 if( null == theme_get_permalink_by_title( 'Register For This Site' ) ) {  // The permalink doesn't exist, so handle this however you best see fit. } else {  // The page exists, so do what you need to do. } // end if/else 

Although we’re technically getting the page’s permalink by its slug, the slug is often synoymous with the page’s title so I tend to prefer to write my functions so they are a bit more readable – title seems to be a bit clearer than slug.

Notice also that I’m performing a strtolower within the theme_get_permalink_by_title function. WordPress will handle the case when it’s lowercase and I always find it a best practice to normalize whatever input the user has provided given the function.

tommcfarlin.com


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.