来宾作者-如果来宾作者URL将遵循特定的模式/格式,如何修改我的自定义函数代码?

时间:2013-08-17 作者:Crystal Jones

基于前面问题中提供的可怕的G.M.代码(Use Custom Fields to Create Guest Author Link), 我现在有一个自定义函数,它使用自定义字段来支持来宾作者。代码将更改帖子作者以显示来宾作者姓名,并将作者链接更改为我选择的来宾作者URL。这是我添加到主题函数中的代码。支持来宾作者的php文件:

//Guest Author Handling - Uses custom fields for guest author name and URL. Changes the guest author name display and changes the author link to guest author URL of your choosing
add_filter( \'get_the_author_user_url\', \'guest_author_url\' ); 
add_filter( \'the_author\', \'guest_author_link\' ); 
add_filter( \'get_the_author_display_name\', \'guest_author_name\' );

function guest_author_url($url) {
  global $post;
  $guest_url = get_post_meta( $post->ID, \'guest-url\', true );
  if ( filter_var($guest_url, FILTER_VALIDATE_URL) ) {
    return $guest_url;
  } elseif ( get_post_meta( $post->ID, \'guest-author\', true ) ) {
    return \'#\';
  }
  return $url;
}

function guest_author_link($name) {
  global $post;
  $guest_url = get_post_meta( $post->ID, \'guest-url\', true );
  $guest_name = get_post_meta( $post->ID, \'guest-author\', true );
  if ( $guest_name && filter_var($guest_url, FILTER_VALIDATE_URL) ) {
    return \'<a href="\' . esc_url( $guest_url ) . \'" title="\' . esc_attr( sprintf(__("Visit %s&#8217;s website"), $guest_name) ) . \'" rel="author external">\' . $guest_name . \'</a>\';
  } elseif( $guest_name ) {
    return $guest_name;
  }
  return $name;
}

function guest_author_name( $name ) {
  global $post;
  $guest_name = get_post_meta( $post->ID, \'guest-author\', true );
  if ( $guest_name ) return $guest_name;
  return $name;
}
玩了这个之后,我想到可以简化来宾作者URL条目。我的来宾作者的URL将始终按以下格式设置:

http://yoursite.com/author/[AuthorName]
由于URL将始终遵循相同的模式,我需要知道的是如何修改G.M.的代码,以便只需在来宾作者URL的自定义字段中输入[AuthorName]?

我希望这有意义。。。

2 个回复
最合适的回答,由SO网友:gmazzap 整理而成

现在我明白了这个问题,是的,这是有道理的。

过滤器添加和第三个功能根本没有改变,前两个功能有什么变化。

有2种情况:

  1. [AuthorName] url中的部分是等效的sanitize_title($guestauthor) 其中,$guestauthor是保存在“来宾作者”自定义字段中的内容[AuthorName] part与“guest author”自定义字段不同且独立。在第一种情况下,我们可以假设guest authors始终有一个自定义url,而您根本不需要“guest url”自定义字段。代码变为:

    function guest_author_url($url) {
      global $post;
      $guest_url_suffix = sanitize_title( get_post_meta( $post->ID, \'guest-author\', true ) );
      $guest_url = $guest_url_suffix ? site_url() . \'/author/\' .  $guest_url_suffix : null;
      if ( filter_var($guest_url, FILTER_VALIDATE_URL) ) {
        return $guest_url;
      }
      return $url;
    }
    
    function guest_author_link($name) {
      global $post;
      $guest_name = get_post_meta( $post->ID, \'guest-author\', true );
      $guest_url = $guest_name ? site_url() . \'/author/\' . sanitize_title($guest_name) : null;
      if ( $guest_name && filter_var($guest_url, FILTER_VALIDATE_URL) ) {
        return \'<a href="\' . esc_url( $guest_url ) . \'" title="\' . esc_attr( sprintf(__("Visit %s&#8217;s website"), $guest_name) ) . \'" rel="author external">\' . $guest_name . \'</a>\';
      }
      return $name;
    }
    
    在第二种情况下,您必须在“guest\\u url”自定义字段中输入[AuthorName] url的一部分。这给了你一个额外的可能性:如果你不在这个字段中输入任何内容,就不会为用户显示任何链接。这种情况的代码是:

    function guest_author_url($url) {
      global $post;
      $guest_url_suffix = get_post_meta( $post->ID, \'guest-url\', true );
      $guest_url = $guest_url_suffix ? site_url() . \'/author/\' .  $guest_url_suffix : null;
      if ( filter_var($guest_url, FILTER_VALIDATE_URL) ) {
        return $guest_url;
      } elseif ( get_post_meta( $post->ID, \'guest-author\', true ) ) {
        return \'#\';
      }
      return $url;
    }
    
    function guest_author_link($name) {
      global $post;
      $guest_url_suffix = get_post_meta( $post->ID, \'guest-url\', true );
      $guest_url = $guest_url_suffix ? site_url() . \'/author/\' .  $guest_url_suffix : null;
      $guest_name = get_post_meta( $post->ID, \'guest-author\', true );
      if ( $guest_name && filter_var($guest_url, FILTER_VALIDATE_URL) ) {
        return \'<a href="\' . esc_url( $guest_url ) . \'" title="\' . esc_attr( sprintf(__("Visit %s&#8217;s website"), $guest_name) ) . \'" rel="author external">\' . $guest_name . \'</a>\';
      } elseif( $guest_name ) {
        return $guest_name;
      }
      return $name;
    }
    
    新代码未经测试,但除非有任何拼写错误,否则它应该可以工作。

SO网友:Matt Costa

为了防止有人在这里寻找如何添加来宾描述,下面是我的完整实现。

如果遵循与其他答案相同的逻辑,我只添加了一个get_the_author_description 过滤器和覆盖作者个人信息的功能(说明)。与上面的其他解决方案一样,您可以将其作为自定义字段传递(请参见所附图像)。

enter image description here

这是完整的实现,添加了上述解决方案。

// Change Guest Author Name, Link and Description
add_filter( \'get_the_author_user_url\', \'guest_author_url\' ); 
add_filter( \'the_author\', \'guest_author_link\' ); 
add_filter( \'get_the_author_display_name\', \'guest_author_name\' );
add_filter( \'get_the_author_description\', \'guest_author_description\' );

function guest_author_url($url) {
  global $post;
  $guest_url = get_post_meta( $post->ID, \'guest-url\', true );
  if ( filter_var($guest_url, FILTER_VALIDATE_URL) ) {
    return $guest_url;
  } elseif ( get_post_meta( $post->ID, \'guest-author\', true ) ) {
    return \'\';
  }
  return $url;
}

function guest_author_link($name) {
  global $post;
  $guest_url = get_post_meta( $post->ID, \'guest-url\', true );
  $guest_name = get_post_meta( $post->ID, \'guest-author\', true );
  if ( $guest_name && filter_var($guest_url, FILTER_VALIDATE_URL) ) {
    return \'\' . $guest_name . \'\';
  } elseif( $guest_name ) {
    return \'\' . $guest_name . \'\';
  }
  return $name;
}


function guest_author_description($description) {
  global $post;
  $guest_description = get_post_meta( $post->ID, \'guest-description\', true );
  if ( $guest_description ) return $guest_description;
  elseif ( get_post_meta( $post->ID, \'guest-author\', true ) ) {
    return \'\';
  }
  return $description;
}

function guest_author_name( $name ) {
  global $post;
  $guest_name = get_post_meta( $post->ID, \'guest-author\', true );
  if ( $guest_name ) return $guest_name;
  return $name;
}

结束