是否有可能从子弹中获取页面链接?


113

是否可以仅从子弹中获取页面的永久链接?我知道您可以使用get_page_link()以下代码从ID中获取页面的永久链接:

<a href="<?php echo get_page_link(40); ?>">Map</a>

我很好奇是否有任何方法可以处理页面的内容-像这样:

<a href="<?php echo get_page_link('map'); ?>">Map</a>

Answers:


183

您是在说Pages对吗?没有帖子。

这是您要找的东西吗?

  1. get_permalink( get_page_by_path( 'map' ) )
  2. get_permalink( get_page_by_title( 'Map' ) )
  3. home_url( '/map/' )

4
你是说get_permalink(get_page_by_path('contact')->ID));
桑普森

1
嗯不?身份证号是什么?
zeo 2010年

3
get_page_by_path()返回所有页面信息的数组。get_permalink()将页面ID作为第一个参数。我以为我必须显式传递ID值。
桑普森

10
@Jonathan:并不总是有文档记录,但是许多WP函数都接受数字ID和完整的post对象作为参数。
Jan Fabry 2010年

1
似乎在处理子页面时使用get_page_by_path()可能会非常复杂...
Kaaviar 2011年

9

我认为这可能更好:

function get_page_by_slug($page_slug, $output = OBJECT, $post_type = 'page' ) {
    global $wpdb;
    $page = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_type= %s", $page_slug, $post_type ) );
    if ( $page )
            return get_page($page, $output);
    return null;
}

遵循get_page_by_titlewordpress的“原始”模式。(第3173行)

rgds


11
为什么会更好?你可以解释吗?
julien_c 2012年

最后的评论-我认为sql需要再有一个条件:function get_page_by_slug($page_slug, $output = OBJECT, $post_type = 'page' ) { global $wpdb; $page = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_name = %s AND post_type= %s AND post_status = 'publish'", $page_slug, $post_type ) ); if ( $page ) return get_page($page, $output); return null; }

为什么?它不会仅仅为了获取ID而生成完整的post对象。
s_ha_dum 2013年

@webcitron我认为这只是因为遵循Wordpress的原始模式通过“标题”发布帖子,只是更改为“ slug”。(检查链接
Matheus Eduardo

这是一个很好的答案。这绕过了流氓插件掩盖页面或错误过滤页面的可能性。如果您从发布表中返回ID,则可以\WP_Post从其中创建一个实例,该实例将直接在所有检查其他值的wordpress函数中解析。\WP_Post还提供直接找到有关帖子的最相关数据的方法。
mopsyd

6

这是Tom McFarlin 在他的博客上发布的一种方法:

/**
 * Returns the permalink for a page based on the incoming slug.
 *
 * @param   string  $slug   The slug of the page to which we're going to link.
 * @return  string          The permalink of the page
 * @since   1.0
 */
function wpse_4999_get_permalink_by_slug( $slug, $post_type = '' ) {

    // Initialize the permalink value
    $permalink = null;

    // Build the arguments for WP_Query
    $args = array(
        'name'          => $slug,
        'max_num_posts' => 1
    );

    // If the optional argument is set, add it to the arguments array
    if( '' != $post_type ) {
        $args = array_merge( $args, array( 'post_type' => $post_type ) );
    }

    // Run the query (and reset it)
    $query = new WP_Query( $args );
    if( $query->have_posts() ) {
        $query->the_post();
        $permalink = get_permalink( get_the_ID() );
        wp_reset_postdata();
    }
    return $permalink;
}

它适用于自定义帖子类型和内置帖子类型(例如postpage)。


2

接受的答案是错误的,因为层次页面无法像这样工作。简而言之,该信息并不总是页面或帖子的路径。例如,您的页面上有一个孩子,等等。路径将是parent-slug/child-slug并且get_page_by_path将无法找到child-slug这种方式。正确的解决方案是这样的:

function mycoolprefix_post_by_slug($the_slug, $post_type = "page"){
 $args = array(
   'name'        => $the_slug,
   'post_type'   => $post_type,
   'post_status' => 'publish',
   'numberposts' => 1
 );
 $my_page = get_posts($args)[0];
 return $my_page;
}

<a href="<?php echo mycoolprefix_post_by_slug('map'); ?>">Map</a>

1

尝试这个:

<a href="<?php echo get_page_link( get_page_by_path( 'map' ) ); ?>">Map</a>

get_page_by_path( 'path' )返回页面/帖子对象,get_page_link()当接受帖子/页面对象并返回固定链接时,可以使用该对象。


2
编辑您的答案,并添加解释:为什么这可以解决问题?
fuxia

0
    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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.