Ist es möglich, einen Seitenlink von seiner Schnecke zu bekommen?

113

Ist es möglich, den Permalink einer Seite allein aus dem Slug zu erhalten? Mir ist bekannt, dass Sie den Permalink der Seite aus der ID abrufen können, indem Sie Folgendes verwenden get_page_link():

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

Ich bin neugierig, ob es eine Möglichkeit gibt, dasselbe mit dem Block einer Seite zu tun - wie folgt:

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

Antworten:

183

Du sprichst von Pages, oder? Keine Beiträge.

Ist es das wonach du suchst:

  1. get_permalink( get_page_by_path( 'map' ) )
  2. get_permalink( get_page_by_title( 'Map' ) )
  3. home_url( '/map/' )
zeo
quelle
4
Meinten Sie get_permalink(get_page_by_path('contact')->ID));?
Sampson
1
hmmm nein? Was ist mit der ID?
Zeo
3
get_page_by_path()Gibt ein Array aller Seiteninformationen zurück. get_permalink()Nimmt eine Seiten-ID als erstes Argument. Ich dachte, ich müsste den ID-Wert explizit übergeben.
Sampson
10
@ Jonathan: Es ist nicht immer dokumentiert, aber viele WP-Funktionen akzeptieren sowohl numerische IDs als auch vollständige Post-Objekte als Argument.
Jan Fabry
1
Es scheint, dass get_page_by_path () im Umgang mit
untergeordneten
9

Ich denke das könnte besser sein:

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

Nach dem Muster "original" get_page_by_titlevon WordPress . (Zeile 3173)

rgds

Matheus Eduardo
quelle
11
Warum wäre das besser? Können Sie erklären?
Julien_c
Letzter Kommentar - Ich denke, dass SQL eine weitere Bedingung haben muss: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; }
Warum? Es wird kein vollständiges Post-Objekt generiert, nur um die ID zu erhalten.
s_ha_dum
@webcitron Ich denke, nur weil es dem Originalmuster von Wordpress folgt, das nach "Titel" gepostet wird, und nur nach "Schnecke" wechselt. (überprüfen Sie den Link )
Matheus Eduardo
Das ist eine gute Antwort. Dies umgeht die Möglichkeit, dass ein Rogue-Plugin Ihre Seite maskiert oder falsch filtert. Wenn Sie die ID aus der Post-Tabelle zurückgeben, können Sie daraus eine Instanz erstellen \WP_Post, die direkt in allen WordPress-Funktionen aufgelöst wird, die nach anderen Werten suchen. \WP_PostBietet auch Methoden zum direkten Auffinden der wichtigsten Daten zum Beitrag.
Mopsyd
6

Dies ist eine Methode, die von Tom McFarlin in seinem Blog veröffentlicht wurde :

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

Es funktioniert mit benutzerdefinierten Beitragstypen und integrierten Beitragstypen (wie postund page).

shea
quelle
2

Die akzeptierte Antwort ist falsch, weil hierarchische Seiten nicht so funktionieren. Einfach ausgedrückt, der Slug ist nicht immer der Pfad der Seite oder des Posts. ZB hat Ihre Seite ein untergeordnetes Element usw. Der Pfad wird parent-slug/child-slugund get_page_by_pathwird child-slugdiesen Weg nicht finden . Die richtige Lösung lautet:

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
quelle
1

Versuche dies:

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

get_page_by_path( 'path' )Gibt ein Page / Post-Objekt zurück, das dann verwendet werden kann, get_page_link()da es ein Post / Page-Objekt akzeptiert und einen Permalink zurückgibt.

Sigma Wadbude
quelle
2
Bitte bearbeiten Sie Ihre Antwort und fügen Sie eine Erklärung hinzu: Warum könnte dies das Problem lösen?
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

Verwenden Sie diese Funktion von

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
user46487
quelle