Czy można uzyskać link do strony ze ślimaka?

113

Czy możliwe jest uzyskanie bezpośredniego linku strony z samego ślimaka? Wiem, że można uzyskać bezpośredni link do strony z identyfikatora za pomocą get_page_link():

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

Jestem ciekawy, czy jest jakiś sposób, aby zrobić to samo z kopią strony - na przykład:

<a href="<?php echo get_page_link('map'); ?>">Map</a>
Sampson
źródło

Odpowiedzi:

183

Mówisz o Pages, prawda? Nie posty.

Czy tego właśnie szukasz:

  1. get_permalink( get_page_by_path( 'map' ) )
  2. get_permalink( get_page_by_title( 'Map' ) )
  3. home_url( '/map/' )
zeo
źródło
4
Miałeś na myśli get_permalink(get_page_by_path('contact')->ID));?
Sampson,
1
hmmm nie? Co z tym identyfikatorem?
zeo
3
get_page_by_path()zwraca tablicę wszystkich informacji o stronie. get_permalink()przyjmuje identyfikator strony jako pierwszy argument. Pomyślałem, że muszę jawnie przekazać wartość identyfikatora.
Sampson,
10
@Jathanathan: Nie zawsze jest to udokumentowane, ale wiele funkcji WP przyjmuje jako argument zarówno identyfikatory numeryczne, jak i pełne wpisy.
Jan Fabry,
1
Wydaje się, że użycie get_page_by_path () może być dość skomplikowane w przypadku stron potomnych ...
Kaaviar
9

Myślę, że może być lepiej:

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;
}

zgodnie ze wzorem „oryginalnego” get_page_by_titlewordpress . (linia 3173)

rgds

Matheus Eduardo
źródło
11
Dlaczego miałoby być lepiej? Możesz wytłumaczyć?
julien_c
Ostatni komentarz - Myślę, że sql musi mieć jeszcze jeden warunek: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; }
Dlaczego? Nie generuje pełnego obiektu post tylko po to, aby uzyskać identyfikator.
s_ha_dum
@webcitron Myślę, że tylko dlatego, że podąża za oryginalnym wzorcem, w którym Wordpress dostaje post przez „tytuł”, po prostu zmienia się na „ślimak”. (sprawdź link )
Matheus Eduardo
To dobra odpowiedź. Pomija to możliwość nieuczciwej wtyczki maskującej twoją stronę lub niepoprawnie ją filtrującej. Jeśli zwrócisz identyfikator z tabeli postów, możesz utworzyć z niego instancję \WP_Post, która rozwiązuje się bezpośrednio we wszystkich funkcjach wordpress, które sprawdzają inne wartości. \WP_Postzapewnia również metody bezpośredniego wyszukiwania najbardziej powiązanych danych o poście.
mopsyd
6

Oto metoda opublikowana przez Toma McFarlina na jego blogu :

/**
 * 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;
}

Działa z niestandardowymi typami postów i wbudowanymi typami postów (takimi jak posti page).

shea
źródło
2

zaakceptowana odpowiedź jest błędna, ponieważ strony hierarchiczne tak nie działają. Mówiąc prosto, ślimak nie zawsze jest ścieżką strony lub postu. Np. Twoja strona ma dziecko itp. Ścieżka będzie parent-slug/child-slugi get_page_by_pathnie uda się jej znaleźć child-slug. Prawidłowe rozwiązanie jest następujące:

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>
Toskan
źródło
1

Spróbuj tego:

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

get_page_by_path( 'path' )zwraca obiekt strony / postu, z którego może następnie skorzystać, get_page_link()ponieważ akceptuje obiekt post / strony i zwraca link bezpośredni.

Sigma Wadbude
źródło
2
Proszę edytować swoje odpowiedzi i dodać wyjaśnienie: dlaczego , które mogą rozwiązać ten problem?
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

Użyj tej funkcji do

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
użytkownik46487
źródło