wordpress 移除指定的控制面板菜单

在开发wordpress主题的过程当中,通常我们会对面板菜单进行精简或者对部分设置菜单进行屏蔽,可以通过Wordpress的动作钩子在主题目录的functions.php文件下进行相关操作。

add_action( 'admin_menu', 'wpjan_remove_ad_menus' );
function wpjan_remove_ad_menus(){
remove_menu_page( 'index.php' );                  //仪表页面,控制台首页
remove_menu_page( 'edit.php' );                   //文章页面
remove_menu_page( 'upload.php' );                 //多媒体页面
remove_menu_page( 'edit.php?post_type=page' );    //页面管理
remove_menu_page( 'edit-comments.php' );          //评论菜单
remove_menu_page( 'themes.php' );                 //主题个性设置
remove_menu_page( 'plugins.php' );                //插件页面
remove_menu_page( 'users.php' );                  //用户页面
remove_menu_page( 'tools.php' );                  //工具页面
remove_menu_page( 'options-general.php' );        //设置页面 
}

如果是移除单个菜单,比如设置界面:

remove_menu_page( ‘options-general.php’ ); //设置页面

也可以移除插件生成的菜单,只要复制链接中的标识文件,例如隐藏pods字段管理

http://xxx.com/wp-admin/admin.php?page=pods

可以使用函数:

remove_menu_page( ‘admin.php?page=pods’ );

我们来看一下,wordpress的动作钩子的用法:

add_action( $tag, $function_to_add, $priority,$accepted_args );

参数

$tag

(字符串)(必填)$function_to_add 所挂载的动作(action)的名称。(在Plugin API/Action Reference 上查看动作hook列表)。也可以是一个主题或插件文件内部的一个动作,或者特定的标签“all”,这个函数将被所有的钩子(hooks)调用。

默认值:None

$function_to_add

(回调)(必填)你希望挂载的函数的名称。注:在 PHP“回调”类型文档中 所罗列的字符串格式化的语法均可用。

默认值:None

$priority

(整数)(可选)用于指定与特定的动作相关联的函数的执行顺序。数字越小,执行越早,具有相同优先级的函数在它们被添加到动作的顺序执行。

默认值:10

$accepted_args

(整数)(可选)挂钩函数所接受的参数数量。在 WordPress1.5.1 及以后的版本中,挂钩函数可以是调用do_action() 或 apply_filters()时设置的参数。例如,comment_id_not_found动作将传递任何函数,若该函数将所请求的评论编号连接到该动作。

默认值:1

返回值

(布尔)总是True。

wordpress输出bootstrap的菜单结构

现在自适应网页(即常说的响应式设计,一个网页在PC\平板\手机上显示不同的布局)用的越来越多,然而,对于大多数人来说,写一个自适应的网页并非易事,于是有了bootstrap。

Bootstrap是twitter的工程师利用业余时间制作推出的一个开源的用于前端开发的工具包,即里面已经写好了css js,你只需要引入它的js和css,然后根据要求,给网页的div添加相应的class属性,即可制作一个响应式网页。

说实话,bootstrap很方便,作者使用过一次,但是有一个缺点,那就是你需要引入bootstrap的框架的css和js,然而这个css里面,有很多代码都是你用不到的,这样就会产生很多冗余代码,而去除css的冗余代码绝对是个体力活,所以作者用过一次就不用了。

将bootstrap应用到wordpress上也很简单,唯一可能有困难的就是菜单,因为bootstrap的菜单有他自己的结构和属性,最新的菜单演示页面如下:http://v3.bootcss.com/examples/navbar/

查看网页源文件,可以看到菜单的结构大概是这样

<ul class="nav navbar-nav">   
  <li class="active"><a href="#">Link</a></li>   
  <li class="dropdown">   
    <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown <b class="caret"></b></a>   
    <ul class="dropdown-menu">   
      <li><a href="#">Action</a></li>   
      <li><a href="#">Another action</a></li>   
    </ul>   
  </li>   
</ul>

要在wordpress上实现这个菜单结构看似不难,其实,里面Dropdown后面的<b class=”caret”></b>对应网页中下拉菜单的那个到三角形,以及二级菜单的ul标签的class属性。除非你把菜单写死,否则使用wp_nav_menu函数是无法输出这两个内容的。

那要怎么办呢?
wordpress的wp_nav_menu函数参数如下:

    <?php   
      
    $defaults = array(   
        'theme_location'  => '',   
        'menu'            => '',   
        'container'       => 'div',   
        'container_class' => '',   
        'container_id'    => '',   
        'menu_class'      => 'menu',   
        'menu_id'         => '',   
        'echo'            => true,   
        'fallback_cb'     => 'wp_page_menu',   
        'before'          => '',   
        'after'           => '',   
        'link_before'     => '',   
        'link_after'      => '',   
        'items_wrap'      => '<ul id="%1$s" class="%2$s">%3$s</ul>',   
        'depth'           => 0,   
        'walker'          => ''  
    );   
      
    wp_nav_menu( $defaults );   
      
    ?>  

其中的walker参数是关键。

更改你的主题菜单输出函数wp_nav_menu的walker参数:

<?php   
wp_nav_menu( array(   
'theme_location' => 'ashu_menu',   
'depth' => 2,   
'container' => false,   
'menu_class' => 'nav navbar-nav',   
'fallback_cb' => 'wp_page_menu',   
//添加或更改walker参数   
'walker' => new wp_bootstrap_navwalker())   
);   
?>

上面代码中walker参数的值是一个类,所以接下来你需要添加这个类,在你的主题functions.php文件中添加下面代码:

或者https://github.com/twittem/wp-bootstrap-navwalker/blob/master/wp_bootstrap_navwalker.php

    <?php   
      
    /**
     * Class Name: wp_bootstrap_navwalker  
     * GitHub URI: https://github.com/twittem/wp-bootstrap-navwalker  
     * Description: A custom WordPress nav walker class to implement the Bootstrap 3 navigation style in a custom theme using the WordPress built in menu manager.  
     * Version: 2.0.4  
     * Author: Edward McIntyre - @twittem  
     * License: GPL-2.0+  
     * License URI: http://www.gnu.org/licenses/gpl-2.0.txt  
     */  
      
    class wp_bootstrap_navwalker extends Walker_Nav_Menu {   
      
        /**
         * @see Walker::start_lvl()  
         * @since 3.0.0  
         *  
         * @param string $output Passed by reference. Used to append additional content.  
         * @param int $depth Depth of page. Used for padding.  
         */  
        public function start_lvl( &$output, $depth = 0, $args = array() ) {   
            $indent = str_repeat( "\t", $depth );   
            $output .= "\n$indent<ul role=\"menu\" class=\" dropdown-menu\">\n";   
        }   
      
        /**
         * @see Walker::start_el()  
         * @since 3.0.0  
         *  
         * @param string $output Passed by reference. Used to append additional content.  
         * @param object $item Menu item data object.  
         * @param int $depth Depth of menu item. Used for padding.  
         * @param int $current_page Menu item ID.  
         * @param object $args  
         */  
        public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {   
            $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';   
      
            /**
             * Dividers, Headers or Disabled  
             * =============================  
             * Determine whether the item is a Divider, Header, Disabled or regular  
             * menu item. To prevent errors we use the strcasecmp() function to so a  
             * comparison that is not case sensitive. The strcasecmp() function returns  
             * a 0 if the strings are equal.  
             */  
            if ( strcasecmp( $item->attr_title, 'divider' ) == 0 && $depth === 1 ) {   
                $output .= $indent . '<li role="presentation" class="divider">';   
            } else if ( strcasecmp( $item->title, 'divider') == 0 && $depth === 1 ) {   
                $output .= $indent . '<li role="presentation" class="divider">';   
            } else if ( strcasecmp( $item->attr_title, 'dropdown-header') == 0 && $depth === 1 ) {   
                $output .= $indent . '<li role="presentation" class="dropdown-header">' . esc_attr( $item->title );   
            } else if ( strcasecmp($item->attr_title, 'disabled' ) == 0 ) {   
                $output .= $indent . '<li role="presentation" class="disabled"><a href="#">' . esc_attr( $item->title ) . '</a>';   
            } else {   
      
                $class_names = $value = '';   
      
                $classes = empty( $item->classes ) ? array() : (array) $item->classes;   
                $classes[] = 'menu-item-' . $item->ID;   
      
                $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args ) );   
      
                if ( $args->has_children )   
                    $class_names .= ' dropdown';   
      
                if ( in_array( 'current-menu-item', $classes ) )   
                    $class_names .= ' active';   
      
                $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';   
      
                $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args );   
                $id = $id ? ' id="' . esc_attr( $id ) . '"' : '';   
      
                $output .= $indent . '<li' . $id . $value . $class_names .'>';   
      
                $atts = array();   
                $atts['title']  = ! empty( $item->title )   ? $item->title  : '';   
                $atts['target'] = ! empty( $item->target )  ? $item->target : '';   
                $atts['rel']    = ! empty( $item->xfn )     ? $item->xfn    : '';   
      
                // If item has_children add atts to a.   
                if ( $args->has_children && $depth === 0 ) {   
                    $atts['href']           = '#';   
                    $atts['data-toggle']    = 'dropdown';   
                    $atts['class']          = 'dropdown-toggle';   
                    $atts['aria-haspopup']  = 'true';   
                } else {   
                    $atts['href'] = ! empty( $item->url ) ? $item->url : '';   
                }   
      
                $atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args );   
      
                $attributes = '';   
                foreach ( $atts as $attr => $value ) {   
                    if ( ! empty( $value ) ) {   
                        $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );   
                        $attributes .= ' ' . $attr . '="' . $value . '"';   
                    }   
                }   
      
                $item_output = $args->before;   
      
                /*
                 * Glyphicons  
                 * ===========  
                 * Since the the menu item is NOT a Divider or Header we check the see  
                 * if there is a value in the attr_title property. If the attr_title  
                 * property is NOT null we apply it as the class name for the glyphicon.  
                 */  
                if ( ! empty( $item->attr_title ) )   
                    $item_output .= '<a'. $attributes .'><span class="glyphicon ' . esc_attr( $item->attr_title ) . '"></span>&nbsp;';   
                else  
                    $item_output .= '<a'. $attributes .'>';   
      
                $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;   
                $item_output .= ( $args->has_children && 0 === $depth ) ? ' <span class="caret"></span></a>' : '</a>';   
                $item_output .= $args->after;   
      
                $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );   
            }   
        }   
      
        /**
         * Traverse elements to create list from elements.  
         *  
         * Display one element if the element doesn't have any children otherwise,  
         * display the element and its children. Will only traverse up to the max  
         * depth and no ignore elements under that depth.  
         *  
         * This method shouldn't be called directly, use the walk() method instead.  
         *  
         * @see Walker::start_el()  
         * @since 2.5.0  
         *  
         * @param object $element Data object  
         * @param array $children_elements List of elements to continue traversing.  
         * @param int $max_depth Max depth to traverse.  
         * @param int $depth Depth of current element.  
         * @param array $args  
         * @param string $output Passed by reference. Used to append additional content.  
         * @return null Null on failure with no changes to parameters.  
         */  
        public function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) {   
            if ( ! $element )   
                return;   
      
            $id_field = $this->db_fields['id'];   
      
            // Display this element.   
            if ( is_object( $args[0] ) )   
               $args[0]->has_children = ! empty( $children_elements[ $element->$id_field ] );   
      
            parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );   
        }   
      
        /**
         * Menu Fallback  
         * =============  
         * If this function is assigned to the wp_nav_menu's fallback_cb variable  
         * and a manu has not been assigned to the theme location in the WordPress  
         * menu manager the function with display nothing to a non-logged in user,  
         * and will add a link to the WordPress menu manager if logged in as an admin.  
         *  
         * @param array $args passed from the wp_nav_menu function.  
         *  
         */  
        public static function fallback( $args ) {   
            if ( current_user_can( 'manage_options' ) ) {   
      
                extract( $args );   
      
                $fb_output = null;   
      
                if ( $container ) {   
                    $fb_output = '<' . $container;   
      
                    if ( $container_id )   
                        $fb_output .= ' id="' . $container_id . '"';   
      
                    if ( $container_class )   
                        $fb_output .= ' class="' . $container_class . '"';   
      
                    $fb_output .= '>';   
                }   
      
                $fb_output .= '<ul';   
      
                if ( $menu_id )   
                    $fb_output .= ' id="' . $menu_id . '"';   
      
                if ( $menu_class )   
                    $fb_output .= ' class="' . $menu_class . '"';   
      
                $fb_output .= '>';   
                $fb_output .= '<li><a href="' . admin_url( 'nav-menus.php' ) . '">Add a menu</a></li>';   
                $fb_output .= '</ul>';   
      
                if ( $container )   
                    $fb_output .= '</' . $container . '>';   
      
                echo $fb_output;   
            }   
        }   
    }  

wordpress 禁止编辑主题和插件

禁用WordPress主题和插件的在线编辑器

在网站根目录下的 wp-config.php 文件添加下面代码即可:

//禁止在线编辑主题和插件
define( 'DISALLOW_FILE_EDIT', true );

禁止升级/安装/编辑WordPress主题和插件

同样在网站根目录下的 wp-config.php 文件添加下面代码即可:

//禁止安装/升级/编辑主题和插件
define('DISALLOW_FILE_MODS',true);

添加后面第二种代码以后,就连主题的设置选项都不能修改,所以请先设置好主题的选项后再添加代码。

为 WooCommerce 添加新的前端用户中心子菜单及自定义功能页面

WooCommerce 账户中心页面默认有一个我的账户侧边栏,该侧边栏是用户中心所有功能的一个菜单链接。对于使用 WooCommerce 进行商品销售的网站来说,这些功能基本上够用了。如果想进行 WooCoommerce 二次开发,在 WooCommerce 的前端用户中心实现一些自定义功能,加在 WooCommerce 默认的功能页面显然是不合适的,这时候,我们为 WooCommerce 添加一个我的账户子菜单和自定义页面是比较合理的选择。下面我们来看一下怎么实现这个需求的。

第一步:创建我的账户中心新端点,也就是创建新菜单

首先,我们需要使用 add_rewrite_endpoint() 函数注册新的页面端点,同时使用 query_vars 过滤器注册新的查询字符串。

/**
 * 注册在我的账户页面使用的新的端点
 *
 * @see https://developer.wordpress.org/reference/functions/add_rewrite_endpoint/
 */
function wizhi_endpoints() {
    add_rewrite_endpoint( 'wizhi-endpoint', EP_ROOT | EP_PAGES );
}

add_action( 'init', 'wizhi_endpoints' );

/**
 * 添加新的查询字符串
 *
 * @param array $vars
 * @return array
 */
function wizhi_query_vars( $vars ) {
    $vars[] = 'wizhi-endpoint';

    return $vars;
}

add_filter( 'query_vars', 'wizhi_query_vars', 0 );

注册了新的页面端点后,在主题或插件激活后,我们需要使用flush_rewrite_rules()刷新重定向规则才能使新的页面端点生效,或者在 设置 > 固定链接 的选项页面创新保存一下选项。如果我们在激活主题或插件时使用 flush_rewrite_rules() 刷新重定向规则,确保在刷新重定向规则缓存之前已经添加了页面端点。

在插件中使用示例:

/**
 * 在插件激活时,刷新重定向规则缓存
 */
function wizhi_flush_rewrite_rules() {
    add_rewrite_endpoint( 'my-custom-endpoint', EP_ROOT | EP_PAGES );
    flush_rewrite_rules();
}

register_activation_hook( __FILE__, 'wizhi_flush_rewrite_rules' );
register_deactivation_hook( __FILE__, 'wizhi_flush_rewrite_rules' );

在主题中使用示例:

/**
 * 主题激活时,刷新重定向规则缓存
 */
function my_custom_flush_rewrite_rules() {
    add_rewrite_endpoint( 'my-custom-endpoint', EP_ROOT | EP_PAGES );
    flush_rewrite_rules();
}

add_action( 'after_switch_theme', 'my_custom_flush_rewrite_rules' );

第二步,添加我们创建的自定义菜单到 WooCommerce 用户中心菜单

WooCommerce 为我们提供了woocommerce_account_menu_items 过滤器以便我们管理我的账户页面的菜单。

在菜单上添加新菜单项目

下面的示例演示了如何在 logout 菜单项目前添加一个新的菜单项目。

/**
 * 在我的账户菜单中添加新的菜单项目
 *
 * @param array $items
 * @return array
 */
function wizhi_my_account_menu_items( $items ) {
    // 先移除登出链接
    $logout = $items['customer-logout'];
    unset( $items['customer-logout'] );

    // 添加自定义菜单项目
    $items['my-custom-endpoint'] = __( '自定义菜单', 'woocommerce' );

    // 重新添加登出链接
    $items['customer-logout'] = $logout;

    return $items;
}

add_filter( 'woocommerce_account_menu_items', 'wizhi_my_account_menu_items' );

我们也可以添加自定义菜单到我的账户页面菜单中的任意位置。

/**
 * 自定义插入项目到数据中的某个项目之后的辅助功能
 *
 * @param array $items
 * @param array $new_items
 * @param string $after
 * @return array
 */
function my_custom_insert_after_helper( $items, $new_items, $after ) {
    // 搜索指定的位置,+1 就是该位置之后位置
    $position = array_search( $after, array_keys( $items ) ) + 1;

    // 插入新项目
    $array = array_slice( $items, 0, $position, true );
    $array += $new_items;
    $array += array_slice( $items, $position, count( $items ) - $position, true );

    return $array;
}

/**
 * 插入一个新的自定义菜单到我的账户页面菜单
 *
 * @param array $items
 * @return array
 */
function wizhi_my_account_menu_items( $items ) {
    $new_items = array();
    $new_items['my-custom-endpoint'] = __( '自定义菜单', 'woocommerce' );

    // 在 `我的订单` 后面添加新的自定义菜单
    return my_custom_insert_after_helper( $items, $new_items, 'orders' );
}

add_filter( 'woocommerce_account_menu_items', 'wizhi_my_account_menu_items' );

第三步:管理新添加的菜单项目页面显示的内容

WooCommerce 自动为每个菜单项目创建了一个 hook,用来显示该菜单项目对应的页面内容,该 hook 的名称为 woocommerce_account_{$endpoint}_endpoint 。

默认的 WooCommerce 我的账户菜单端点 hooks

默认情况下,WooCommerce 我的账户页面菜单有以下几个 hooks:

  • woocommerce_account_orders_endpoint
  • woocommerce_account_view-order_endpoint
  • woocommerce_account_downloads_endpoint
  • woocommerce_account_edit-address_endpoint
  • woocommerce_account_payment-methods_endpoint
  • woocommerce_account_add-payment-method_endpoint
  • woocommerce_account_edit-account_endpoint

为自定义菜单添加页面内容

/**
 * 自定义菜单页面显示的内容
 */
function wizhi_endpoint_content() {
    echo '<p>Hello World!</p>';
}

add_action( 'woocommerce_account_my-custom-endpoint_endpoint', 'wizhi_endpoint_content' );

修改一个页面菜单标题

我们或可以通过 the_title 过滤器修改上面添加的自定义页面的标题。

/*
 * 修改自定义菜单页面标题
 *
 * @param string $title
 * @return string
 */
function wizhi_endpoint_title( $title ) {
    global $wp_query;

    $is_endpoint = isset( $wp_query->query_vars['wizhi-endpoint'] );

    if ( $is_endpoint && ! is_admin() && is_main_query() && in_the_loop() && is_account_page() ) {
        // 新页面标题
        $title = __( '自定义 WooCommerce 我的账户菜单', 'woocommerce' );

        remove_filter( 'the_title', 'wizhi_endpoint_title' );
    }

    return $title;
}

add_filter( 'the_title', 'wizhi_endpoint_title' );

wordpress 特色图像功能

在主题的functions.php中添加如下代码

//使WordPress支持post thumbnail
if ( function_exists( 'add_theme_support' ) ) {
    add_theme_support( 'post-thumbnails' );
}

如何调用特色图像

<?php
if ( has_post_thumbnail() ) { // check if the post has a Post Thumbnail assigned to it.
    the_post_thumbnail();
}
?>
<?php the_content(); ?>

WordPress获取特色图像地址主要需要用到两个函数get_post_thumbnail_idwp_get_attachment_image_src。下面是分别获取小、中、大、完整、指定图片规格的图片地址的方法。

获取特色图像:小

$thumbnail_image_url = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'thumbnail');
echo $thumbnail_image_url[0];

获取特色图像:中

$medium_image_url = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'medium');
echo $medium_image_url[0];

获取特色图像:大

$large_image_url = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'large');
echo $large_image_url[0];

获取特色图像:完整

$full_image_url = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), 'full');
echo $full_image_url[0];

获取特色图像:指定100×100

$array_image_url = wp_get_attachment_image_src( get_post_thumbnail_id($post->ID), array(100,100));
echo $array_image_url[0];

wordpress 面包屑导航

functions.php

function cmp_breadcrumbs() {
  $delimiter = '»'; // 分隔符
  $before = '<span class="current">'; // 在当前链接前插入
  $after = '</span>'; // 在当前链接后插入
  if ( !is_home() && !is_front_page() || is_paged() ) {
    echo '<div itemscope itemtype="http://schema.org/WebPage" id="crumbs">'.__( 'You are here:' , 'cmp' );
    global $post;
    $homeLink = home_url();
    echo ' <a itemprop="breadcrumb" href="' . $homeLink . '">' . __( 'Home' , 'cmp' ) . '</a> ' . $delimiter . ' ';
    if ( is_category() ) { // 分类 存档
      global $wp_query;
      $cat_obj = $wp_query->get_queried_object();
      $thisCat = $cat_obj->term_id;
      $thisCat = get_category($thisCat);
      $parentCat = get_category($thisCat->parent);
      if ($thisCat->parent != 0){
        $cat_code = get_category_parents($parentCat, TRUE, ' ' . $delimiter . ' ');
        echo $cat_code = str_replace ('<a','<a itemprop="breadcrumb"', $cat_code );
      }
      echo $before . '' . single_cat_title('', false) . '' . $after;
    } elseif ( is_day() ) { // 天 存档
      echo '<a itemprop="breadcrumb" href="' . get_year_link(get_the_time('Y')) . '">' . get_the_time('Y') . '</a> ' . $delimiter . ' ';
      echo '<a itemprop="breadcrumb"  href="' . get_month_link(get_the_time('Y'),get_the_time('m')) . '">' . get_the_time('F') . '</a> ' . $delimiter . ' ';
      echo $before . get_the_time('d') . $after;
    } elseif ( is_month() ) { // 月 存档
      echo '<a itemprop="breadcrumb" href="' . get_year_link(get_the_time('Y')) . '">' . get_the_time('Y') . '</a> ' . $delimiter . ' ';
      echo $before . get_the_time('F') . $after;
    } elseif ( is_year() ) { // 年 存档
      echo $before . get_the_time('Y') . $after;
    } elseif ( is_single() && !is_attachment() ) { // 文章
      if ( get_post_type() != 'post' ) { // 自定义文章类型
        $post_type = get_post_type_object(get_post_type());
        $slug = $post_type->rewrite;
        echo '<a itemprop="breadcrumb" href="' . $homeLink . '/' . $slug['slug'] . '/">' . $post_type->labels->singular_name . '</a> ' . $delimiter . ' ';
        echo $before . get_the_title() . $after;
      } else { // 文章 post
        $cat = get_the_category(); $cat = $cat[0];
        $cat_code = get_category_parents($cat, TRUE, ' ' . $delimiter . ' ');
        echo $cat_code = str_replace ('<a','<a itemprop="breadcrumb"', $cat_code );
        echo $before . get_the_title() . $after;
      }
    } elseif ( !is_single() && !is_page() && get_post_type() != 'post' ) {
      $post_type = get_post_type_object(get_post_type());
      echo $before . $post_type->labels->singular_name . $after;
    } elseif ( is_attachment() ) { // 附件
      $parent = get_post($post->post_parent);
      $cat = get_the_category($parent->ID); $cat = $cat[0];
      echo '<a itemprop="breadcrumb" href="' . get_permalink($parent) . '">' . $parent->post_title . '</a> ' . $delimiter . ' ';
      echo $before . get_the_title() . $after;
    } elseif ( is_page() && !$post->post_parent ) { // 页面
      echo $before . get_the_title() . $after;
    } elseif ( is_page() && $post->post_parent ) { // 父级页面
      $parent_id  = $post->post_parent;
      $breadcrumbs = array();
      while ($parent_id) {
        $page = get_page($parent_id);
        $breadcrumbs[] = '<a itemprop="breadcrumb" href="' . get_permalink($page->ID) . '">' . get_the_title($page->ID) . '</a>';
        $parent_id  = $page->post_parent;
      }
      $breadcrumbs = array_reverse($breadcrumbs);
      foreach ($breadcrumbs as $crumb) echo $crumb . ' ' . $delimiter . ' ';
      echo $before . get_the_title() . $after;
    } elseif ( is_search() ) { // 搜索结果
      echo $before ;
      printf( __( 'Search Results for: %s', 'cmp' ),  get_search_query() );
      echo  $after;
    } elseif ( is_tag() ) { //标签 存档
      echo $before ;
      printf( __( 'Tag Archives: %s', 'cmp' ), single_tag_title( '', false ) );
      echo  $after;
    } elseif ( is_author() ) { // 作者存档
      global $author;
      $userdata = get_userdata($author);
      echo $before ;
      printf( __( 'Author Archives: %s', 'cmp' ),  $userdata->display_name );
      echo  $after;
    } elseif ( is_404() ) { // 404 页面
      echo $before;
      _e( 'Not Found', 'cmp' );
      echo  $after;
    }
    if ( get_query_var('paged') ) { // 分页
      if ( is_category() || is_day() || is_month() || is_year() || is_search() || is_tag() || is_author() )
        echo sprintf( __( '( Page %s )', 'cmp' ), get_query_var('paged') );
    }
    echo '</div>';
  }
}

主题调用代码:

<?php if(function_exists('cmp_breadcrumbs')) cmp_breadcrumbs();?>

WordPress通过文章ID获取文章标题内容等信息

在很多的 WordPress 主题或者插件功能的开发中,我们总是需要获取到 WordPress 给每个页面定义的 ID,不然也某些情况下是无法确定这是哪一个页面,针对于文章或者页面的 ID 获取基本可以使用 get_the_ID()这个函数来直接获取,但是在循环外该函数是无法获取到值的。

那么下面在主题开发中遇到的情况下,收集整理了几个方法:

方法一:

//文章或页面的 ID 值,如果未在循环中输出值可能不准确
$postid = get_the_ID();  
echo $postid;

方法二:

//检索当前查询对象的 ID
$current_id = get_queried_object_id();  
echo $current_id;

方法三:

// 检索当前查询的对象,从对象中获取 ID
$object = get_queried_object();
$id = $object -> ID;
echo $id;

方法四:

// 通过$post 全局变量获取文章或页面 ID
global $post;
$id = $post -> ID;
echo $id;

补充内容:

// 第一种获取父级页面的 ID
global $post;
$id = $post -> ID;
$parent = get_post_ancestors($post -> ID);
print_r($parent);//打印出 Array ( [0] => 101 ) 
 
// 第二种获取父级页面的 ID
global $post;
$parent_id = $post -> post_parent;
echo $parent_id;//打印出父级页面的 ID

其实究竟要怎么去获取还是需要根据实际的开发情况而确定,文章或页面或者循环中可以使用 get_the_ID 函数直接获取,如果需要某些特殊或者 get_the_ID 获取不正确的时候,使用 get_queried_object_id 函数也就足够了,至于其它的方法大家自己研究吧!

wordpress父级Page页面调用所属Page子页面内容

在开发制作特殊的wordpress主题时,可能会有调用当前Page页面的page子页面标题、内容、链接、特色图像等内容的需要,对于这种需求,可能通过get_pages函数获取所属子页面信息,然后使用foreach循环输出。

实现方法:

<?php 
  $pages = get_pages('child_of='.$post->ID.'&sort_column=post_date&sort_order=desc&parent='.$post->ID);
    foreach($pages as $page){
    $content = $page->post_content;
?>
  <div>
        特色图像:<?php echo get_the_post_thumbnail($page->ID); ?>
        输出标题:<?php echo $page->post_title; ?>
        输出内容:<?php echo $content; ?>
        输出链接<a href="<?php echo get_page_link($page->ID); ?>">阅读全文</a>
    </div>
<?php } ?>

2018年春节WP100放假通知

一年一度的中国传统佳节、喜庆团圆的春节即将到来。

在此深深地感谢您长期以来对WP100的关心和支持,并衷心地祝福各位吉祥好事多,幸福笑颜开。

WP100春节放假以及值班安排如下:

2月10日至2月22日放假,2月23日年初八正常上班!

放假期间,WP100仍提供24小时技术及售后支持服务,服务热线:400-992-1238。

放假期间,暂停网站开发,主题开发,插件开发,网站设计等相关业务。

如您有上述业务需求,请等待正常上班后处理。

如有不便,敬请见谅。

最后,在此提前祝君年年旺,团团又圆圆。